文章目录
一、前言
走在最前沿的技术边缘上,对物联网各种无线模块开发特敏感,对于双模 WiFi+Ble 开源的模块,大家第一印象就是想到乐鑫的ESP32,毕竟它已经出来好几年了,而且开发资料特丰富,现在价格也比当年降了一大半,可谓性价比也够高的。
每一个模组都有其大卖的道理,国内出现很多国产的性价比很高的模组,今天给大家带来的是平头哥芯片TG7100C方案的安信可模组TG-12F;
那么推荐这个模组的性价比高在哪里?作为Ble+WiFi双模的模块,价格竟然不到10块钱,和现在的ESP8266的价格差不多,虽然开发资料还没那么多丰富,今天给大家带来它的应用方案 ---- 天猫精灵语音插座。
也许你会问, 这个和ESP8266有啥区别,不就是一个天猫精灵控制吗?用TG-12F模组实现的话,可以实现蓝牙辅助配网+WiFi远程控制;而目前发文为止,ESP32还没适配阿里飞燕蓝牙辅助配网,也可能没开源出来,蛮期待的,但期待了半年,依然毫无音讯;
具体的ESP32天猫精灵开源代码也可参考这个开源仓库:esp-ali-smartliving
今天,小编做了下天猫精灵生态的火热几个开源的WiFi模块的对比表,如有异议,请文章留言:
二、环境搭建
目前TG-12F模组开发环境仅支持Linux环境,不支持windows环境。
注意
- 不要使用 Windows 下 Ubuntu 子系统,建议使用虚拟机软件安装 Ubuntu。
- 不要在 Windows 下载解压代码再拷贝到 Ubuntu 系统中,建议直接在 Ubuntu 系统内下载和解
压代码,使用 git clone 下载代码。 - 不要把代码存放在 Windows 共享目录下,然后通过 mount 挂载到 Ubuntu 系统里。建议直接在
Ubuntu 系统内下载和解压代码。
安装 Ubuntu(版本 16.04 X64)程序运行时库。请您按顺序逐条执行命令。
sudo apt-get update
sudo apt-get -y install libssl-dev:i386
sudo apt-get -y install libncurses-dev:i386
sudo apt-get -y install libreadline-dev:i386
安装 Ubuntu(版本 16.04 X64)依赖软件包。请您按顺序逐条执行命令。
sudo apt-get update
sudo apt-get -y install git wget make flex bison gperf unzip
sudo apt-get -y install gcc-multilib
sudo apt-get -y install libssl-dev
sudo apt-get -y install libncurses-dev
sudo apt-get -y install libreadline-dev
sudo apt-get -y install python python-pip
安装 Python 依赖包。请您按顺序逐条执行命令。
python -m pip install setuptools
python -m pip install wheel
python -m pip install aos-cube
python -m pip install esptool
python -m pip install pyserial
python -m pip install scons
说明
安装完成后,请您使用 aos-cube --version查看 aos-cube 的版本号,需确保 aos-cube 的版本号大于等于 0.5.11。如果在安装过程中遇到网络问题,可使用国内镜像文件。
安装/升级 pip
python -m pip install --trusted-host=mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip
基于 pip 依次安装第三方包和 aos-cube
pip install --trusted-host=mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple/ setuptools
pip install --trusted-host=mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple/ wheel
pip install --trusted-host=mirrors.aliyun.com -i https://mirrors.aliyun.com/pypi/simple/ aos-cube
获取SDK
以下的仓库,是针对安信可TG-12F开发板适配的一套SDK,分支是release_1.6.6
;
git clone -b release_1.6.6 https://gitee.com/Ai-Thinker-Open/Ai-Thinker-Open-TG7100C_SDK.git
代码结构如下:
├── Products
│ │ ├── example/smart_outlet
│ │ │ ├── app_entry.c
│ │ │ ├── app_entry.h
│ │ │ ├── combo_net.c
│ │ │ ├── device_state_manger.c
│ │ │ ├── device_state_manger.h
│ │ │ ├── factory.c
│ │ │ ├── factory.h
│ │ │ ├── makefile
│ │ │ ├── make.settings
│ │ │ ├── msg_process_center.c
│ │ │ ├── msg_process_center.h
│ │ │ ├── property_report.c
│ │ │ ├── property_report.h
│ │ │ ├── smart_outlet.h
│ │ │ ├── smart_outlet.json
│ │ │ ├── smart_outlet_main.c
│ │ │ ├── smart_outlet.mk
│ │ │ ├── vendor.c
│ │ │ └── vendor.h
- 厂家需要适配的文件(设备初始化等):vendor.c、vendor.h
- 应用程序主入口:app_entry.c、 smart_outlet_main.c
- 配网和连云状态管理:device_state_manger.c
- 设备控制指令处理:msg_process_center.c
- 设备属性上报:property_report.c
- 厂测模式:factory.c
三、编译代码和烧录固件
直接跑脚本build.sh
即可,里面默认编译的是 smart_outlet
这个工程;
./build.sh
出现下面的打印,则编译成功:
如何烧录?您需要把根目录的out文件夹放在window下烧录,个人建议在build.sh
脚本文件里面实现编译之后,拷贝整个out文件夹到共享文件夹,这样不用手动复制了;
下载TG-12F的烧录工具:点我下载,打开 TGFlashEnv.exe :
- Partition Table:烧录工具自带的 partition_cfg_2M.toml 文件;
- Boot2 Bin : 烧录工具自带的 chipsp_boot2.bin 文件;
- Firmware Bin: 刚刚编译的out文件夹的bin文件;
用USB线连接好TG-12F开发板,点击Create & Download
按钮即可一键下载;
四、烧录阿里云五元组
也许有客户会有疑问,不是阿里云三元组吗?这里给大家解释下,合并了天猫精灵和阿里飞燕平台之后,就多了2个数据,是Product Id和 ProductSecret;
第一步:获取到模块的mac地址
先获取到模块的mac地址,先把 DTR 选项勾上,发送指令 mac 即可返回;比如下面获取到的是b4e8420ffc90,这个信息很重要,关乎到配网步骤;
第二步:到阿里云新建产品;
点击阿里云生活物联网平台,然后自行新建产品,功能定义如下:
或者您可以导入我们事先准备好的物模型文件:点击下载,然后一键导入就可以了;
第三步:人即交互设置;
在人机交互界面,可自定义设备面板,注意要使能APP控制;
第四步:生成调试设备;
在新增测试设备,填入的DeviceName是第一步骤拿到的mac地址噢。比如b4e8420ffc90,切记!!
使用蓝牙协议设备,需要使用Mac地址充当DeviceName,以确保设备的正常使用。
第五步:烧录五元组;
使用串口命令AT+LINKKEYCONFIG
分别写入Product Key
,Device Name
,Device Secret
,Product Secret
和Product Id
.
五元组 | 数值 |
---|---|
Product Key | a18ZXlt4Bpx |
Device Name | b4e8420ffc90 |
Device Secret | c956caa7264589b3d9192da6ada66fa6 |
Product Secret | haR4qXTXLHxVhHYn |
Product Id | 6172628 |
则,这样填入:
AT+LINKKEYCONFIG="a18ZXlt4Bpx","b4e8420ffc90","c956caa7264589b3d9192da6ada66fa6","haR4qXTXLHxVhHYn","6172628 "
设备回复OK表示写入成功;
第六步:云智能APP自动发现并蓝牙辅助配网;
这里先科普下阿里生活平台蓝牙辅助配网的一些常见问题:
知识点①:阿里生活平台蓝牙辅助配网和天猫精灵PB-GATT/ADV 配网方式不一样
蓝牙辅助配网基于已有的WiFi+BLE的Combo
芯片方案,利用BLE的通信能力,将WiFi连接所需的SSID
、无线密码等信息传输给 WiFi+BLE Combo
设备,使设备顺利接入互联网与云端,继而完设备绑定、数据上下行传输等功能。
而天猫精灵蓝牙Mesh入网是以PB-GATT/ADV
配网,在蓝牙技术联盟发布的Mesh Profile
的基础上,做了一些协议上的定制,细化了部分协议规则,作为蓝牙Mesh
模组软件规范,指导模组厂家软件设计并对接生活物联网平台与天猫精灵音箱。
- 蓝牙Mesh设备必须支持
PB-ADV、PB-GATT
。 - 蓝牙Mesh设备必须支持Mesh协议里定义的
Proxy
功能。 - 非低功耗蓝牙Mesh设备必须支持
Mesh
协议里定义的Relay
功能,并且可以被正确打开和关闭。 LPN
和Friend
功能可选。- 低功耗设备采用精灵低功耗(
GLP
)方案。 蓝牙Mesh设备要求至少支持2个NetKey
、5个AppKey
。
良好的习惯就是阅读阿里云物联网开发的文档:点我阅读
知识点②:支持天猫精灵PB-GATT/ADV 配网方式,则可以 “找队友” 配置入网。
前面已经提到了阿里生活平台蓝牙辅助配网和天猫精灵PB-GATT/ADV 配网方式不一样,所以阿里生活平台蓝牙辅助配网则不可以在天猫精灵找队友配置入网;
长按按键3秒以上则进去蓝牙辅助配网模式并重启,LED快闪;
下载云智能APP,并注册账号登陆,点击添加设备,即可自动发现设备:
- 控制界面:
四、代码部分说明
4.1 继电器/LED/按键的GPIO口定义;
单路插座需要两个 GPIO 分别控制继电器开关、LED 亮灭和一个 GPIO 读取按键状 态。那么只需要修改 vendor.c 中定义,具体 GPIO 需要参考模组的管脚定义及产品原理图,实例如下:
#if defined(UNO_91H) /* on hf-lpt230 EVB */
#define LED_GPIO 8
#define RELAY_GPIO 24
#define KEY_GPIO 25
#elif defined(MX1270) /* on mx1270 EVB */
#define LED_GPIO 11
#define RELAY_GPIO 6
#define KEY_GPIO 8
#elif defined(BK7231UDEVKITC)
#define LED_GPIO 15
#define RELAY_GPIO 17
#define KEY_GPIO 28
#else /* default config */
#define LED_GPIO 22
#define RELAY_GPIO 5
#define KEY_GPIO 4
#endif
4.2 设备状态 LED 指示说明;
目前标品固件中实现的状态显示如下,可以根据产品的不同需求做调整。 相关代码在文件 Products/example/smart_outlet/device_state_manger.c
中,indicate_net_state_task
负责指示设备处于不同状态。
4.3 设备按键处理
根据用户按下按键的时长,确定用户的行为,目前按键有三种用户行为处理。不同行为的按键时长,用户可以自行定义,代码 Products/example/smart_outlet/device_state_manger.c
, key_detect_event_task
函数负责按键处理。
if (nCount >= 40)
{
do_awss_reset(); //重置网络,进去配网模式
LOG("do long button ");
}
else if (nCount >= 3)
{
LOG("do short button");
if (product_get_switch() == ON)
{
product_set_switch(OFF); //关灯
user_post_powerstate(OFF);//上报数据
}
else
{
product_set_switch(ON); //开灯
user_post_powerstate(ON);//上报数据
}
}
}
4.4 服务器下报数据处理
在文件 Products/example/smart_outlet/msg_process_center.c
文件处理:
void msg_process_task(void *argv)
{
uint32_t h, s, v;
unsigned int rcvLen;
recv_msg_t msg;
user_example_ctx_t *user_example_ctx = user_example_get_ctx();
device_status_t *device_status = &user_example_ctx->status;
while (true) {
if (aos_queue_recv(g_cmd_msg_queue_id, AOS_WAIT_FOREVER, &msg, &rcvLen) == 0) {
LOG("aos_queue_recv: device_status->powerswitch %d",device_status->powerswitch);
device_status->powerswitch = msg.powerswitch;
device_status->all_powerstate = msg.all_powerstate;
if (msg.powerswitch == 1) {
product_set_switch(ON); //开灯
} else {
product_set_switch(OFF); //关灯
}
report_device_property(msg.seq, msg.flag);
}
}
}
另外,不要把我的博客作为学习标准,我的只是笔记,难有疏忽之处,如果有,请指出来,也欢迎留言哈!
- 玩转
esp8266
带你飞、加群QQ
群,不喜的朋友勿喷勿加:434878850 - 个人邮箱:xuhongv@yeah.net 24小时在线,有发必回复!
- esp8266源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp8266
- esp32源代码学习汇总(持续更新,欢迎star):https://github.com/xuhongv/StudyInEsp32
- 关注下面微信公众号二维码,干货多多,第一时间推送!