如题,公司需求一个 Lora 无线发射器,通过串口发送数据,只有 Javascript 的开发背景,是否可以完成这项任务呢?答案是肯定的!接下来内容将说明如何使用 Haas510,完成 4G 数据接收,Uart 串口转发的过程;
- 原理图:确定技术线路,明确思路
- 准备工作:准备物料、必要的软件工具
- 单元测试:拆解不同功能、步骤,一一实现
- 合并代码:合并单元测试环节代码
- 参考资料:Haas SDK、相关资源
1、原理图
「呼叫 api」->「mqtt server」-> 「haas mqtt client」-> 「haas uart」-> 「lora 发射模组」
负责硬件的同事已完成 lora 模组,本篇仅介绍 Haas510 的使用;
2、准备工作
配合物料、调试工具、以及一些软件框架。JS 程序员对硬件一般比较陌生,好在难度并不大,都是使用现成的配件连接调试;
2.1、物料配置
Haas510 已经附赠了基本配件,仅需要添置一些必要的连接线就可以进行单元测试,以下是物料清单;
[ 物料准备图示 ]
[ 物料清单 ]
物料 | 说明 |
---|---|
Haas510 AS | 数据转发核心板 |
USB 转 TTL | 将杜邦线连接到MacOS的工具,并生成设备标志 |
杜邦线 | 每个连接用到 3 根并联的线材 ,建议长度规格 > 30CM |
MiniUSB 数据线 | 开发期间供电 ,充电头规格 5V2A,保证线材良好 |
Nano 卡 | 一般手机内使用的 SIM 卡就对了 |
为了连接多个USB,还需要 USB 一拖多
小工具
2.2、连接物料
下图标出 ①②③④⑤⑥ 位置,物料按序号进行连接;
[ 三组数据线说明 ]
分组 | 说明 |
---|---|
③ | 用于主板宿主平台的调试输出,以及JS代码的console.log输出 |
④ | 将 JS 编写的代码,从 Mac 传送到 Haas510 主板 |
⑤ | serial.write 数据输出,单元测试期间,通过 comtool 终端 观察数据 |
连接的位置已经用红色位置信息标注;
[ 杜邦线连接线序 ]
一般 USB2TTL 与 Haas510 的 TXD、RXD 需要反接,少部分例外,具体请咨询 【USB 转 TTL】 供应商
2.3、准备软件工具
本人的常用操作系统是 Mac, windows 系统请参考操作;
[ amp 下载 ]
Haas 命令行工具,将编写的 JS 代码上传到 Haas510
[ comtool 安装 ]
Mac上运行的串口终端,用于 ③ 、 ⑤ 的数据调试
brew install --cask comtool
通过 Terminal 输入
open -n /Applications/comtool.app
可以多开
[ mqtt server ]
mosquitto
提供的免费服务器
项目 | 内容 |
---|---|
服务器 | test.mosquitto.org |
通信类型 | TCP |
端口 | 1883 |
账号密码 | 任意 |
客户端 ID | 任意 |
3、单元测试
这里将任务进行分解,每个单元单独完成,最后合并起来就可以了,还是上任务表吧:
单元 | 内容 |
---|---|
端口确认 | 确定USB在Mac中的设备名称 |
代码调试 | 演示如何在桌面端通过串口工具打印信息 |
amp | 讲解 amp 基本使用,以及演示如何通过 amp 将代码写入 Haas510 |
数据监听 | 与 mqtt 服务器通信,并获取主题消息 |
串口输出 | Haas510 如何通过串口输出数据 |
3.1、端口确认
现在开始验证 ③ ④ ⑤ 是否正确接入, 使用 ls
指令及简单的拔插来确认设备名称;
ls -1 /dev/cu.wch*
目前我的配置是:
编号 | 用途 | 设备名称 |
---|---|---|
③ | 代码调试 | /dev/cu.wchusbserial14410 |
④ | 写入代码 | /dev/cu.wchusbserial14420 |
⑤ | 串口输出 | /dev/cu.wchusbserial14430 |
USB 需要WCH
驱动支持,链接在文章最后
Windows 系统打开设备管理器,可以看到 COM1、COM2 这样设备
3.2、代码调试
启动 comtool
工具,Port 选择 /dev/cu.wchusbserial14410, Baudrate 选择 115200,其他默认;
按一次 Haas510 上的 RESET
按键,接收区滚动起来,就代表调试状态 OK 了;
以下内容这个窗口称为 DEBUG 窗口
3.3、amp 使用
[ 基本配置 ]
将 2.3章节
下载好压缩包解压,进入目录可以看到:
├── README.md 说明
├── amp 执行文件
├── app 开发目录
│ ├── app.js
│ └── app.json
└── bindings.node 驱动文件
amp 修改为可执行文件
chmod +x amp
打印帮助
./amp help
Usage: amp [options]
AliOS Things Mini Program PC CLI tool
Options:
-V, --version output the version number
-h, --help output usage information
Commands:
login|ln <token> login
devicelist|dl list bind devices
put|pt <filepath> <deviceName> upload file to device
pack|pk [options] <filepath> pack file
seriallist|sl list serial port
serialput|sp [options] <filepath> <port> put file to device via serial port
Example call:
$ amp pt ./app 3JvyRjXOoQLQUYzGzAy0 -b 9600
[ 编辑 app.js ]
修改 app/app.js
, 新版的 Haas510 内置了 quickjs,支持 ES6 规范,可以直接使用箭头函数等新的语法
console.log('amp version is: ' + system.version())
console.log('amp platform is: ' + system.platform())
console.log('amp heapTotal is: ' + system.memory().heapTotal)
console.log('amp heapUsed is: ' + system.memory().heapUsed)
// 写个定时器
let i = 0
setInterval(() => {
console.log('i is ', ++i)
}, 2000)
准备在控制台上传
./amp serialput ./app /dev/cu.wchusbserial14420
回车后提示 reboot
时,按一次 Haas510 上的 RESET 按钮
generating app package...
Wait shakehand with board ...
Please reboot board now
Putting: ██████████████████████████████ 2/2
put complete!
- 如果 ④ 接入正常,会看到一个上传进度
- 同时可在调试窗口观察到系统加载的数据瀑布流,最后执行
app.js
代码
3.4、数据监听
本项目数据转发有实时性的要求, MQTT 是最佳选择;
Haas510 已经内置这个模块,支持两种连接方式:
- 连接到 阿里云物联网平台
- 连接到第三方 mqtt 服务器
这里选择第 2 种方案,确认已经安装好 SIM 卡及天线;
[ 编辑 app.js ]
import * as network from 'network'
import * as mqtt from 'mqtt'
const topic = '/haas510/as'
const config = {
host: 'test.mosquitto.org',
port: 1883,
username: '',
password: ''
}
// 这个函数只用于 console.log 打印,实际转发串口数据是不需要的
function ArrayToString(fileData) {
let dataString = ''
for (let i = 0; i < fileData.length; i++) {
dataString += String.fromCharCode(fileData[i])
}
return dataString
}
function createMqttClient() {
const mqttClient = mqtt.createClient(config)
mqttClient.on('connect', () => {
console.log('----------------------------: connect')
// 此时进行订阅设置
mqttClient.subscribe({ topic })
})
mqttClient.on('disconnect', () => {
console.log('----------------------------: disconnect')
})
mqttClient.on('message', (topic, payload) => {
// 监听消息并打印,payload 是 Array[Number]
let content = ArrayToString(payload)
console.log('----------------------------: mqtt message')
console.log('[' + topic + '] message: ' + content)
})
}
const net = network.openNetWorkClient()
net.on('connect', () => createMqttClient())
[ 消息测试 ]
编写一个简单的 mqtt 客户端来发送测试消息,新建目录并安装依赖;本地需要有 nodejs 环境;
# 建立文件夹
mkdir -p /path/to/mqttclient && cd /path/to/mqttclient
# npm 初始化及依赖
npm init -y && npm install mqtt
# 创建 index.js
touch index.js
将代码贴入 index.js
const mqtt = require('mqtt')
const client = mqtt.connect('mqtt://test.mosquitto.org:1883')
const topic = '/haas510/as'
client.on('connect', () => {
client.publish(topic, 'Hello Haas510')
client.end()
})
然后执行 node index.js
,在 DEBUG 窗口
可观察到打印 Hello Haas510
3.5、串口输出
本单元测试的时候直接输出到 Mac,通过观察串口工具显示,直观了解数据是否符合预期需求
[ 串口工具配置 ]
启动串口工具 comtool
,这里速率根据 Lora 模组要求来设定的
- 端口选择
/dev/cu.wchusbserial14430
- 速率选择
9600
[ 配置 app/app.json ]
需要告诉 Haas510 连接什么类型端口、以及配置
{
"version": "1.0.0",
"io": {
"UART1": {
"type": "UART",
"port": 1,
"dataWidth": 8,
"baudRate": 9600,
"stopBits": 1,
"flowControl": "disable",
"parity": "none"
}
},
"debugLevel": "DEBUG"
}
其中 io.UART1 就是 ⑤ 位置标注的 567 三个接线位
[ 编辑 app/app.js ]
import * as uart from 'uart'
const serial = uart.open({ id: 'UART1' })
setInterval(() => {
// 输出字符串 123
serial.write([49, 50, 51])
}, 2000)
需要注意的是:
- id 就是 app.json 里头的 io.UART1
- serial.write 参数是 Array[Number],其中 Number 是字符的 ASCII 码
- mqtt 的 message 默认就是 Array[Number],无需做转换
执行上传
./amp serialput ./app /dev/cu.wchusbserial14420
Haas510 启动完毕后,就可以在 comtool
工具上看到字符串被定时打印;
4、合并代码
import * as network from 'network'
import * as mqtt from 'mqtt'
import * as uart from 'uart'
const serial = uart.open({ id: 'UART1' })
const createMqttClient = () => {
const mqttClient = mqtt.createClient({
host: 'test.mosquitto.org',
port: 1883,
username: '',
password: ''
})
mqttClient.on('connect', () => {
mqttClient.subscribe({ topic: '/haas510/as' })
})
mqttClient.on('disconnect', () => {
system.reboot()
})
mqttClient.on('message', (_, payload) => {
if (payload.length) {
serial.write(payload)
}
})
}
const net = network.openNetWorkClient()
net.on('connect', () => createMqttClient())
这里 system.reboot()
是 Haas510 隐藏功能,当 mqtt 断开时,重启主板;
至此,从 mqtt 监听获取数据,到串口输出的工作已经完成;
5、参考资料
[ Haas510 JS Api 参考 ]
[ Mqtt server 自建 ]
[ 工具下载 ]
6、外壳制作篇
https://developer.aliyun.com/article/1008875
期待 Haas 推出更多 JS 技术栈的产品,欢迎共同学习。