请选择 进入手机版 | 继续访问电脑版

智能创客,中国最大的极客空间,智能平台,免费教学,视频教程,手把手教你创造儿时梦想!

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 5915|回复: 3

微信硬件开发系列教程08-蓝牙nrf51822固件编译(airkiss/airsync)

[复制链接]

110

主题

396

帖子

2319

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2319
QQ
发表于 2016-6-3 14:59:25 | 显示全部楼层 |阅读模式
蓝牙nrf51822源代码固件编译,使用上篇搭建的开发环境进行源代码的讲解和编译,下载到开发板中。
010.png
(电脑烧写开发板连线图)仿真+串口的接线。


一、固件源代码下载
ble固件020.png
网盘下载:http://pan.baidu.com/s/1eSjsObo

二、源代码目录结构。
ble固件030.png

services目录里ble_wechat_service.c主要是通信服务功能。
products目录里mpbledemo2.c是airsync验证授权按键收发功能等。
source目录里main.c是入口函数,代码从这里开始走起。
common目录里是一些公用的部分,md5/aes等等

其它代码主要都是官方ble的sdk代码,也采用轮寻的一个小系统,有兴趣可以研究一下。
同时我们也提供纯的ble项目代码,不含airsync,大家就可以知道app如何和ble交互了,以后会做扩展篇。




三、源代码讲解
ble固件040.png
源代码我们主入口main开始,为大家一一解说。双击main.c,声明了m_ble_wechat(微信协议),m_mpbledemo2_handler(数据事件)。
然后进行resource_init资源初始化,advertising_start(蓝牙广播)。
最后进入数据事件轮循,让ble运行。





ble固件050.png
点击resource_init,再按F12自动跳转到函数,如上图。
uart_init()串口初始化。
timers_init()定时器初始化
gpiote_init()io针脚初始化
buttons_init()按钮初始化
ble_stack_init()蓝牙协议践初始化
get_mac_addr(m_addl_adv_manuf_data)获取mac地址等等...
这里我们主要关心,串口调试要用到最多的,io针脚控制灯开关的,buttons按钮,其它很多都是ble系统内部的,我们只要会用就可以了。



ble固件060.png

在uart_init按F12,跳转到uart_init的函数里,因为串口输入做为最重要的调试日志。
在这里设置了串口的脚针,串口的波特率UART_BAUDRATE_BAUDRATE_Baud9600。


ble固件070.png
在buttons_init按F12,跳转到buttons_init的函数里,这里设置了二个按键,一个重启、一个botton1。


ble固件080.png
在ble_stack_init按F12,跳转到协议践的初始化,看到代码将m_ble_wechat、m_mpbledemo2_handler引入,然后on_ble_evt(p_ble_evt)这个函数处理事件,比如蓝牙连接事件,断开事件,发送数据事件,下图我们看看业务类的各个函数声明。


ble固件090.png
这个就是微信业务处理的各个函数,在main()里也一直请求m_data_main_process_func函数。


ble固件100.png
mpbledemo2_data_consume_func,如上图,这个函数接收微信发来的处理,进行验证然后解析,判断是openLightPush就开灯,是closeLightPush就关灯的处理。
做扩展功能可以在这里进行修改,如果是别的值就做别的事。


ble固件110.png
mpbledemo2_button_handler,这个函数处理按键点击后,执行发送信息给微信的实例,仿这个做成传感器传数据就可以啦。
最重要的源代码就是上面讲的这些,想深入研究可以了解ble协议践吧,加油。





四、DeviceID和DeviceType申请和配置
ble固件200.png
http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
点击登陆,然后使用个人微信扫描登陆。






ble固件250.png
先添加一款产品,找到设置,点击进入。




ble固件260.png
ble固件270.png
添加产品,然后填写相关信息,选择蓝牙,以后我们做Wifi时再选择wifi哦。




ble固件280.png
申请成功后,点击产品详情,会看到产品编号,记住它。






ble固件210.png
在上面获取账号appID、appsecret。




ble固件220.png
http://mp.weixin.qq.com/debug/,打开微信公众平台接口调试工具。





ble固件230.png
输入appID、appsecret,获取access_token,后面会使用到这个值。




ble固件240.png
选择:硬件接入api接口调试,设备授权-获取deviceid和二维码 /device/getqrcode,输入access_token。
点击检查问题后,会看到"errcode": 100020, "errmsg": "account quota not enough"
这是因为新版本需要输入&product_id=xxxx,就是上面我们申请得到的产品编号10114(要填写自己的哦)





ble固件290.png
复制https://api.weixin.qq.com/device/getqrcode?access_token=7olhdCJrKFWLots92V0YIq6Oaxj9JHKLj3t41zqnkw8QNky61_g6a550QsT51_ue1x5ekUN0T48ishysQsR0Dls9xW7elU44fdLDhvwEk7BWEvHcXrZRnQIQw0pfRIvFUXDcAIAZCI&product_id=10114(复制你自己生成的哦),后面是添加&product_id=10114(自己的产品编号),用另一个网页选项卡打开,会返回下面的json格式。
{"base_resp":{"errcode":0,"errmsg":"ok"},"deviceid":"gh_0c61a2431300_9886c60e32d1eeff","qrticket":"http:\/\/we.qq.com\/d\/AQDOu5W-_BTxnVphy1Ew-SZRjz3fd6nTFwvm1_qO"}
那么这样就成功获取到deviceid,qrticket(到二维码网站生成就可以扫描了)




ble固件300.png
选择:硬件接入api接口调试,设备授权-利用deviceid更新设备属性 device/authorize_device,填写下面的代码
{
    "device_num": "1",
    "device_list": [
        {
            "id": "gh_0c61a2431300_9886c60e32d1eeff",
            "mac": "D28403895E11",
            "connect_protocol": "3",
            "auth_key": "",
            "close_strategy": "1",
            "conn_strategy": "1",
            "crypt_method": "0",
            "auth_ver": "0",
            "manu_mac_pos": "-1",
            "ser_mac_pos": "-2"
        }
    ],
    "op_type": "1",
    "product_id": "10114"
}
这里要注意,id就是deviceid,mac是开发板的mac地址(下面教大家如何获取),product_id是您申请的id






获取mac,先去搜索lightBlue软件APP(苹果)
安卓:http://pan.baidu.com/s/1eSDKPRc (android下载安装运行,在首页就能看到mac地址了)
ble固件310.jpg
运行,开发板上电后,会看到蓝牙4.0的列表,点击联接。


ble固件320.jpg
看到0xFEC9的Read字段,就是mac地址啦。


ble固件330.jpg
看到OxD28403895E11,就是要的mac地址。





ble固件340.png
{
   "button":[
      {
           "type":"click",
           "name":"点灯",
           "key":"V1001_LIGHT_ON",
           "sub_button":[]
       },
       {
           "type":"click",
           "name":"灭灯",
           "key":"V1001_LIGHT_OFF",
           "sub_button":[]
       }

}
这一步是让公众号生成菜单,成功以后重新进入公众号就能看到菜单了。






ble固件350.png
{"device_id":"gh_0c61a2431300_40687af62461527e","openid":"ozruVv7ujVGDkPGkFdD4ymVBdfQw"}

强制解绑,要输入device_id和openid,openid在测试公众号里面的 "用户列表" 可以看到。
(这个功能一般不用,有时绑定了多个硬件,可以用这个方法解绑)





五、编译固件、下载到蓝牙开发板
ble固件495.jpg
编译固件之前,需要刷写ble的协议浅(你可以理解为底层固件)。
运行nRFgo Studio软件,选择nRF51 Programming,选择SEGGER to USE,点击Program SoftDevice,点击Browse选择"蓝牙demo源代码V3\softdevice"目录里的s110_nrf51822_5.2.1_softdevice.hex,点击Program进行刷写。


ble固件500.jpg
接下来在源代码里设置参数值,准备APPlication的编译,双击comsource.c,右击打开comsource.h头文件


ble固件510.jpg
看到
#define RX_PIN_NUMBER  11
#define TX_PIN_NUMBER  9
#define LED0 20            
#define SYS_RESET 19     
先要设置一下串口脚针,和按键io针脚,要看好开发板的原理图,我们板的io针脚如上图设置。



ble固件520.jpg
双击mpbledemo2.c,右击打开mpbledemo2.h头文件

ble固件530.jpg
#define DEVICE_TYPE "gh_0c61a2431300"
#define DEVICE_ID "gh_0c61a2431300_abff4dbc6c022240"

#define EAM_md5AndNoEnrypt 1
修改成第4节申请获得的参数,DEVICE_TYPE就是微信原始id,DEVICE_ID就是deviceid,EAM_md5AndNoEnrypt使用md5不加入验证
改成这样,在扫描二维码时才能对应上某个硬件。



ble固件540.jpg
设置编译参数,右击项目,Option for Target 'nrf51822'


ble固件550.jpg
设置板型号,选择nRF51822_xxAA。


ble固件561.jpg
设置IROM1和IRAM1数据,这一般在硬件参数文档datasheet有相关介绍。


ble固件570.jpg
选择J-LINK仿真器,然后确定,之后就可以编译了,上图RAM for Algorithm要改成0x20002000(图上是错的)。


ble固件580.jpg
点击编译(或F7,Project->Build targets),然后点击下载(Flash->DownLoad),
看到Application running ...,下载到开发板里就成功了。




六、测试演示airsync蓝牙功能
ble固件610.jpg
airsyscndebug下载:http://pan.baidu.com/s/1mhMLPhA
airsyscndebug是一款专门测试airsyscn协议的app,目前只有安卓,使用它测试通过,那么说明协议就正常了。


ble固件620.jpg
点击列表蓝牙的ble(列表里也可以看到mac地址哦)。


ble固件630.jpg
点击设置,设置完成再点手动测试。


ble固件640.jpg
DEVICE_TYPE就是微信原始id,DEVICE_ID就是deviceid,还记得源代码里也要设置这个吗?一一对应哦。


ble固件650.jpg
点击手动测试,如果看到以上图,说明airsysnc协议正常,没有问题了。


ble固件660.jpg
我们运行“串口调试助手.exe”(以前都有说,没有百度下载吧)
在点手动测试时,串口数据会出现如上图,开发板以后的调试要靠串口数据(非常关键)



ble固件700.jpg
返回退出airsysncdebug界面,将第4节生成的二维码生成:http://cli.im/


ble固件710.jpg
打开微信,扫描二维码,然后确定绑定(如果以前绑定过,一直显示未绑定,可以强行解绑,再扫描一次第4节)

ble固件720.jpg
进入到公众号界面,会显示正在连接中,已连接等字样(我手机显示connected,如果一直显示正在连接,未连接.....,请重上电开发板和微信多试,经常有这样的问题,可能是微信测试服务号不稳定)



ble固件730.jpg
连接成功,同时串口调试助手会显示如上log,就是连接验证授权的成功过程了。








ble固件740.jpg
点击点灯,正常则显示已发送xxxxx(如果这时显示服务器不可用,那么公众号和服务器请求不成功,多试和检查服务器,如果显示未绑定请强行解绑再扫二维码一次)


ble固件750.jpg
这时开发板串口会收到如上数据,源代码解析数据后判断是开灯,就执行了开灯命令light on。
只要我们在这里改一下,就可以实现开门,关窗,发送各种命令(机器人的话就摇头晃脑命令咯),那开发板怎么把数据传给微信呢?下面我们用开发板按键模拟。


ble固件770.jpg 按下开发板上的k2按键,微信就会收到如上信息,
如果按键换成是传感器,微信收到的信息经过的我们部署的服务器时,我们就可以把数据保存到数据库进行用户数据分析,达到智能的概念了。



ble固件780.jpg
再看看串口数据,按键时会msg to send,我们设定默认是Hello,wechat!
然后微信收到后又响应发送了信息回来,这就是硬件和微信的交互了咯。


ble固件790.jpg
这就是微信发送给硬件开发板的API接口,我们也可以用JS调用呀,厉害了然后想怎么搞就行了。
硬件开发板发送数据给微信是使用蓝牙协议的,在源代码里有发送函数哦,更深入自己去研究吧,大神们。





常见问题(调试微信经常出现一些莫名的问题):
1、如何在公众号生成菜单?答:默认是不会在公众号生成菜单,上文就有具体生成菜单的操作方法。

2、在微信公众号开发DEMO的源代码上,菜单新增了url,调用无法生成?
答:动态实行是无法建立的,源代码的BUG问题,按上面方法手动改代码,直接生成,退出再登陆就看到了。

3、扫描二维码,显示连接中,然后断开又重新连接?
答:测试号经常有这样的问题,有时可以连有时又不可以连接,多试几次。

4、设备授权-device/authorize_device,需要注意些什么?
答:"connect_protocol": "3", 这个是3;"auth_key": ""使用加密需填写; "op_type": "1",1为新增;"product_id": "10114"产品编号。
            
5、开发板没有串口输出?
答:在固件源代码里,搜到如下设置正确您开发板的针脚。
#define RX_PIN_NUMBER  11 #define TX_PIN_NUMBER  9





关注@智能创客  微信:znck007(打造DIY创客平台)





回复

使用道具 举报

0

主题

2

帖子

42

积分

新手上路

Rank: 1

积分
42
发表于 2016-6-20 14:49:57 | 显示全部楼层
太牛了 学习了!
回复 支持 反对

使用道具 举报

0

主题

12

帖子

149

积分

禁止发言

积分
149
发表于 2016-10-11 18:42:17 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|手机版|智能创客 ( 桂ICP备14000828号

GMT+8, 2019-1-20 00:08 , Processed in 0.080016 second(s), 18 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表