从知乎复制过来就乱了。。。。。 传送门
公司一直智能饮水这个行业进行研发,前一段时间接到需求,厂商希望能在饮水设备上进行广告投放,并能通地触屏控制饮水机。公司选择了使用Android智能板来开发这套程序,在开发过程中,由于公司在Android这块的技术力量不够强大。所以让我试验一下Liunx + NodeJs这个方案(公司主要技术都在NodeJs这方面)。在试验的过程中,我遇到了很多的问题和挑战,最终得到了一个可行的方案,特此记录,方便以后学习。 开发平台选择 我需要选择一款Liunx开发板,这块板需要支持联网、串口通信、有扩展接口,能播发视频和较强的处理能力。综合考虑我选择了树莓派3B这块板,这块板有1.2G 4核CPU,1G内存,并拥有GPU,4个USB口,40针GPIO口,带有WIFI和蓝牙,有较强的扩展性和可编程性。同时树莓派拥有成熟的社区和系统。于是购买设备如下图:
7’触屏
树莓派3主板一块
5V2A电源
HDMI连接线
USB供电线
PL2303串口转USB口线一条
开发完成的结果如下图所示
系统安装 系统我选择了官方最新的raspbian系统,安装过程比较简单,这里简要介绍下。
先使用SDFormatter.exe将micro卡进行格式化,当然你需一个读卡器,再使用Win32DiskImager.exe将下载好的系统写入到卡中。这个过程网上有很多讲解,我就不详述。要注意的是micro卡一定要选择一个好的,别贪便宜。我买树莓派时商家送了我一个16G的卡,使用这个卡做系统时,老是出莫明其妙的问题,而且写入速度非常慢。后来我使用自己的一个8G卡,一切OK。
系统启动后,连接WIFI,最好设备一个固定的IP,以免每次重启都要重新找IP。打开SSH连接端口。
设置后重启就可以通过putty连接到树莓派了。
配置root用户 使用pi用户连接到树莓派并打开root用户,PI用户的默认密码是raspbian,
sudo passwd 密码 // 修改pi密码 sudo passwd root // 修改root密码 sudo passwd --unlock root // root用户默认为锁定状态 需要解销 解锁完之后就能使用root用户登录了吗?还不行,不要执行下面一步,非常重要
sudo nano /etc/ssh/sshd_config 重启后就可以使用root用户登录了
Node安装与chromium browser配置 树莓派使用的ARM结构的CPU,所以安装下载ARMv7的node解压即可使用。
安装node
// path是你下载的目录 xz -d path tar -xvf path ln -s path/bin/node /usr/bin/node // 不知道如何解释,相当于window的快键方式 ln -s path/bin/npm /usr/bin/node npm config set registry https://registry.npm.taobao.org // 淘宝镜像 安装好node之后,编写一个web服务,让系统一启动就全屏打开chromium。
如何快速编写web服务,请参考我以前的文章
整合Express + Mysql + mocha,自动生成代码 设置开机启动chromium
cd /home/pi/.config // 进入PI用户的config目录 mkdir autostart cd autostart sudo nano my.desktop 写如下图所示内容
原理是:GUI启动后,会自动去运行autostart下面的*.desktop文件,相当于window的启动文件夹。需要说明的是 -kiosk 这个启动属性,称为超级全屏模式,打开后只能通过键盘按Ctrl + F4退出。这样就达到图二的效果了。
为了显示美观我们还必须做四件事。
一,关闭自动休眠
sudo vim /etc/profile.d/screen.sh xset dpms 0 0 0 xset s off
sudo nano /etc/lightdm/lightdm.conf 增加一行:xserver-command=X -s 0 dpms 二,隐藏掉鼠标图标
sudo apt-get install x11-xserver-utils unclutter 三,自动启动web服务
pm2 save pm2 startup 四,关闭chromium恢复页面
sed -i ‘s/exited_cleanly":\ false/exited_cleanly":\ true/g’ /home/pi/.config/chromium/Default/Preferences 这条命令不完全起作用,在非正常情况下重启后,chromium还是显示恢复提示,让我十分烦恼。各位如果有更好的解决办法,请告知我一下,十分感谢。
串口通信 大家可以看到页面有饮水机的状态,包括热水,冷水等信息。这些信息是饮水机的控制板通过串口进行传输的,所以串口的开发非常重要。我使用SerialPort这个node包来实现node对串口的通信。
// 由于SerialPort是调用c/c++代码,所以要进行编译,先安装node-pre-gyp sudo npm install node-pre-gyp --save // 一定要使用这个命令,在serialport git上有说明 sudo npm install serialport --unsafe-perm --build-from-source --save // 然后等待编译完成 const SerialPort = require(‘serialport’); global.serialPort = new SerialPort(’/dev/ttyAMA0’, { baudrate: 38400, autoOpen: false }); const protocol14 = require(rootPath.concat(’/service/protocol14.js’));
serialPort.open(function (error) { if (error) { logger.error(‘串口打开失败’, error); return; } logger.error(‘串口打开成功’);
serialPort.on(‘data’, (data) => { // 校验crc并初步解析数据 const result = util.parseResult(data);
// crc校验失败
if(result === -1) {
serialPort.write(util.crcerror());
return;
}
// protocol14.parseData(result);
console.log(data);
});
serialPort.on(‘error’, (error) => { logger.error(‘串口报错’, error); }); serialPort.on(‘disconnect’, () => { logger.error(‘串口报错连接关闭’); global.serialPort = null; }); serialPort.on(‘close’, () => { logger.error(‘串口报错连接断开’); global.serialPort = null; }); }); 编写上述代码,即可进行串口通信。如何测试?这时,我们买的PL2303线就起到作了,按下图所示接入:个共4条线,电源,接地,TXD,RXD,如果不供电,不要插电源线(切记,别烧板了)
接好之后,在电脑上使用串口助手发送数据,得到响应,但代码并没有收信息,怎么回事?到树莓派论坛查了查,原来PI3的串口被蓝牙占用了。蓝牙模块在这个项目没有用,所以把安关闭掉 就行了。步骤如下
下载 disable pi3 bt overlay文件: pi3-disable-bt-overlay.dts 放到 /boot/overlays 下 sudo nano /boot/config.txt //下面这行加在 config.txt文件最后, dtoverlay=pi3-disable-bt //进入linux后,屏蔽蓝牙功能 sudo systemctl disable hciuart
// 修改/boot/cmdline.txt文件 sudo /boot/cmdline.txt dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
// 重启 sudo reboot 测试,成功通信
总结 回顾起来好像也不是很麻烦,但这个过程我断断续续的花了一个星期才完成,收获良多。
虽然在树莓派上基于浏览器也可以开发类似于Android的程序,但也有很多的问题:
1、在浏览器上播放视频,CPU占用较高,至少是20%。这里必须把GPU的共享内存设置为128M以上,否则会卡顿。
2、插卡式的存储,十分不稳定
3、相比于Android来说,浏览器的用户体验不友好,没有虚似键盘。(后面做了一个JS的虚似键盘)
当然,也有优势
1、基于浏览器是一个开放式的平台,可以方便的开发。
2、可以复用公司web代码
当然,任何技术方案都是根据公司的情况进行取舍
Liunx ==> Linux
不错mark
一直想学物联网方面的东西,从前端不知道如何下手
@467658159 可以先学习linux系统
不错啊
@zouzhenxing Linux在研究node的同时也在学习,不过没有方向啊,不知道该学哪些东西。我本身大学学的是测控,对硬件什么的有点了解,可是都忘得差不多了。 还有网上说javascript成为物联网主流编程语言是真的吗?我看有些排行java还是排在第一的啊