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

时间:2022-08-31 22:45:40
蓝牙nrf51822源代码固件编译,使用上篇搭建的开发环境进行源代码的讲解和编译,下载到开发板中。
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
(电脑烧写开发板连线图)仿真+串口的接线。


一、固件源代码下载
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
网盘下载:http://download.csdn.net/detail/hunhun1122/9807709

二、源代码目录结构。
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 

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

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




三、源代码讲解
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 

源代码我们主入口main开始,为大家一一解说。双击main.c,声明了m_ble_wechat(微信协议),

m_mpbledemo2_handler(数据事件)。

然后进行resource_init资源初始化,advertising_start(蓝牙广播)。
最后进入数据事件轮循,让ble运行。





微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
点击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系统内部的,我们只要会用就可以了。




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

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


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
在buttons_init按F12,跳转到buttons_init的函数里,这里设置了二个按键,一个重启、一个botton1。


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

在ble_stack_init按F12,跳转到协议践的初始化,看到代码将m_ble_wechat、m_mpbledemo2_handler

引入,然后on_ble_evt(p_ble_evt)这个函数处理事件,比如蓝牙连接事件,断开事件,发送数据事件,

下图我们看看业务类的各个函数声明。



微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
这个就是微信业务处理的各个函数,在main()里也一直请求m_data_main_process_func函数。


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

mpbledemo2_data_consume_func,如上图,这个函数接收微信发来的处理,进行验证然后解析,

判断是openLightPush就开灯,是closeLightPush就关灯的处理。

做扩展功能可以在这里进行修改,如果是别的值就做别的事。


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

mpbledemo2_button_handler,这个函数处理按键点击后,执行发送信息给微信的实例,仿这个做

成传感器传数据就可以啦。

最重要的源代码就是上面讲的这些,想深入研究可以了解ble协议践吧,加油。





四、DeviceID和DeviceType申请和配置
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
点击登陆,然后使用个人微信扫描登陆。






微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
先添加一款产品,找到设置,点击进入。




微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
添加产品,然后填写相关信息,选择蓝牙,以后我们做Wifi时再选择wifi哦。




微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
申请成功后,点击产品详情,会看到产品编号,记住它。






微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
在上面获取账号appID、appsecret。




微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
http://mp.weixin.qq.com/debug/,打开微信公众平台接口调试工具。





微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
输入appID、appsecret,获取access_token,后面会使用到这个值。




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





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

复制https://api.weixin.qq.com/device/getqrcode?access_token=7olhdCJrKFWLots92V0YIq6Oa

xj9JHKLj3t41zqnkw8QNky61_g6a550QsT51_ue

1x5ekUN0T48ishysQsR0Dls9xW7elU44fdLDhvwEk7BWEvHcXrZRnQIQw0pfRIvFUXDcAIAZCI

&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(到二维码网站生成就可以扫描了)




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

选择:硬件接入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地址了)
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
运行,开发板上电后,会看到蓝牙4.0的列表,点击联接。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
看到0xFEC9的Read字段,就是mac地址啦。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
看到OxD28403895E11,就是要的mac地址。





微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
{
   "button":[
      {
           "type":"click",
           "name":"点灯",
           "key":"V1001_LIGHT_ON",
           "sub_button":[]
       },
       {
           "type":"click",
           "name":"灭灯",
           "key":"V1001_LIGHT_OFF",
           "sub_button":[]
       }

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






微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
{"device_id":"gh_0c61a2431300_40687af62461527e","openid":"ozruVv7ujVGDkPGkFdD4ymVBdfQw"}

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





五、编译固件、下载到蓝牙开发板
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
编译固件之前,需要刷写ble的协议浅(你可以理解为底层固件)。

运行nRFgo Studio软件,选择nRF51 Programming,选择SEGGER to USE,点击Program SoftDevice,

点击Browse选择"蓝牙demo源代码V3\softdevice"目录里的s110_nrf51822_5.2.1_softdevice.hex,

点击Program进行刷写。



微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
接下来在源代码里设置参数值,准备APPlication的编译,双击comsource.c,右击打开comsource.h头文件


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
看到
#define RX_PIN_NUMBER  11 
#define TX_PIN_NUMBER  9 
#define LED0 20            
#define SYS_RESET 19      
先要设置一下串口脚针,和按键io针脚,要看好开发板的原理图,我们板的io针脚如上图设置。



微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
双击mpbledemo2.c,右击打开mpbledemo2.h头文件

微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
#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不加入验证

改成这样,在扫描二维码时才能对应上某个硬件。



微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
设置编译参数,右击项目,Option for Target 'nrf51822'


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
设置板型号,选择nRF51822_xxAA。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
设置IROM1和IRAM1数据,这一般在硬件参数文档datasheet有相关介绍。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
选择J-LINK仿真器,然后确定,之后就可以编译了,上图RAM for Algorithm要改成0x20002000(图上是错的)。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
点击编译(或F7,Project->Build targets),然后点击下载(Flash->DownLoad),
看到Application running ...,下载到开发板里就成功了。




六、测试演示airsync蓝牙功能
微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
airsyscndebug下载:http://pan.baidu.com/s/1mhMLPhA

airsyscndebug是一款专门测试airsyscn协议的app,目前只有安卓,使用它测试通过,

那么说明协议就正常了。



微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
点击列表蓝牙的ble(列表里也可以看到mac地址哦)。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
点击设置,设置完成再点手动测试。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
DEVICE_TYPE就是微信原始id,DEVICE_ID就是deviceid,还记得源代码里也要设置这个吗?一一对应哦。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
点击手动测试,如果看到以上图,说明airsysnc协议正常,没有问题了。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
我们运行“串口调试助手.exe”(以前都有说,没有百度下载吧)
在点手动测试时,串口数据会出现如上图,开发板以后的调试要靠串口数据(非常关键)



微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
返回退出airsysncdebug界面,将第4节生成的二维码生成:http://cli.im/


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
打开微信,扫描二维码,然后确定绑定(如果以前绑定过,一直显示未绑定,可以强行解绑,再扫描一次第4节)

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

进入到公众号界面,会显示正在连接中,已连接等字样(我手机显示connected,

如果一直显示正在连接,未连接.....,请重上电开发板和微信多试,经常有这样的问题,

可能是微信测试服务号不稳定)




微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
连接成功,同时串口调试助手会显示如上log,就是连接验证授权的成功过程了。








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

点击点灯,正常则显示已发送xxxxx(如果这时显示服务器不可用,那么公众号和服务器请求

不成功,多试和检查服务器,如果显示未绑定请强行解绑再扫二维码一次)



微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
这时开发板串口会收到如上数据,源代码解析数据后判断是开灯,就执行了开灯命令light on。

只要我们在这里改一下,就可以实现开门,关窗,发送各种命令(机器人的话就摇头晃脑命令

咯),那开发板怎么把数据传给微信呢?下面我们用开发板按键模拟。



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

板上的k2按键,微信就会收到如上信息,

如果按键换成是传感器,微信收到的信息经过的我们部署的服务器时,我们就可以把数据

保存到数据库进行用户数据分析,达到智能的概念了。




微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
再看看串口数据,按键时会msg to send,我们设定默认是Hello,wechat!
然后微信收到后又响应发送了信息回来,这就是硬件和微信的交互了咯。


微信硬件开发系列教程07-蓝牙nrf51822固件编译(airkiss/airsync) 
这就是微信发送给硬件开发板的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