树莓派笔记--修改配置文件的LUA脚本


设置配置项:

#!/bin/sh
# 设置配置项
# 找出指定的字段修改为对应的值
# 如果该字段已存在,则修改
# 如果该字段不存在,则添加
# 如果该字段被注释掉,则除去注释再修改
# 如果该字段重复,则每一项都修改
set_config_var() {
  lua - "$1" "$2" "$3" <<EOF > "$3.bak"
local key=assert(arg[1])
local value=assert(arg[2])
local fn=assert(arg[3])
local file=assert(io.open(fn))
local made_change=false
for line in file:lines() do
  if line:match("^#?%s*"..key.."=.*$") then
    line=key.."="..value
    made_change=true
  end
  print(line)
end

if not made_change then
  print(key.."="..value)
end
EOF
mv "$3.bak" "$3"
}

set_config_var $1 $2 $3

应用示例: 设置hdmi_group=1

$ ./set_config.sh  hdmi_group 1 config.txt

清除配置项:

# 如果该字段存在,且未被注释掉时,则在行首添加#注释
clear_config_var() {
  lua - "$1" "$2" <<EOF > "$2.bak"
local key=assert(arg[1])
local fn=assert(arg[2])
local file=assert(io.open(fn))
for line in file:lines() do
  if line:match("^%s*"..key.."=.*$") then
    line="#"..line
  end
  print(line)
end
EOF
mv "$2.bak" "$2"
}

读取配置项:

get_config_var() {
  lua - "$1" "$2" <<EOF
local key=assert(arg[1])
local fn=assert(arg[2])
local file=assert(io.open(fn))
local found=false
for line in file:lines() do
  local val = line:match("^%s*"..key.."=(.*)$")
  if (val ~= nil) then
    print(val)
    found=true
    break
  end
end
if not found then
   print(0)
end
EOF
}

- 阅读全文 -

树莓派笔记--从raspi-config中挖掘出的有用脚本及命令


弹出窗口:

whiptail --msgbox "MassageBox Test" 20 60
whiptail --yesno --defaultno "Yes or No Box Test" 20 60

tr命令: 对来自标准输入的字符进行替换、压缩和删除。
语法
tr(选项)(参数)
选项
-c或——complerment:取代所有不属于第一字符集的字符;
-d或——delete:删除所有属于第一字符集的字符;
-s或--squeeze-repeats:把连续重复的字符以单独一个字符表示;
-t或--truncate-set1:先删除第一字符集较第二字符集多出的字符。

删除空格符:tr -d ' '
删除字符集之外的字符:tr -d -c '0-9 \n'
将制表符转化为空格:tr '\t' ' '
多个空格合并为一个空格: tr -s ' ' ' '
小写字母转换成大写字母:tr '[:lower:]' '[:upper:]'

[:alnum:]:字母和数字
[:alpha:]:字母
[:cntrl:]:控制(非打印)字符
[:digit:]:数字
[:graph:]:图形字符
[:lower:]:小写字母
[:print:]:可打印字符
[:punct:]:标点符号
[:space:]:空白字符
[:upper:]:大写字母
[:xdigit:]:十六进制字符


cut命令: 显示每行从开头算起 num1 到 num2 的文字

使用说明:
cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段写至标准输出。
如果不指定 File 参数,cut 命令将读取标准输入。必须指定 -b、-c 或 -f 标志之一。
参数:
-b :以字节为单位进行分割。这些字节位置将忽略多字节字符边界,除非也指定了 -n 标志。
-c :以字符为单位进行分割。
-d :自定义分隔符,默认为制表符。
-f :与-d一起使用,指定显示哪个区域。
-n :取消分割多字节字符。仅和 -b 标志一起使用。如果字符的最后一个字节落在由 -b 标志的 List 参数指示的
范围之内,该字符将被写出;否则,该字符将被排除。

- 阅读全文 -

树莓派笔记--蓝牙应用


文章摘要: 蓝牙通信分为两种:经典蓝牙和低功耗蓝牙。
早期的蓝牙通信方式称为经典蓝牙(classic bluetooth),经典蓝牙中的数据传输协议是串行仿真协议RFCOMM,RFCOMM仿真了常见的串口连接,数据从一端输入,从另一端取出。经典蓝牙的开发非常简单。基于串口开发的有线键鼠程序,就可以直接用于RFCOMM连接的无线键鼠。此外,经典蓝牙可以快速传输数据。因此,诺基亚N95这样的早期智能手机,也用RFCOMM来互传图片和文件。
经典蓝牙的缺点是比较耗电。后来,诺基亚发明了一种可以降低功耗的蓝牙通信方式。2010年出台的蓝牙4.0把这种通信方式规范为“低功耗蓝牙”(BLE,Bluetooth Low Energy)。BLE把通信双方分为非对称的双方,尽量让其中的一方承担主要的开销,减少另一方的负担。举例来说,手环电量少,而且需要长时间待机。BLE通信的主要负担可以放在电量较充裕且充电方便的手机一侧,从而减少手环的能耗。


硬件平台: raspi4
蓝牙模块:


命令操作: bluetoothctl命令进入蓝牙命令模式,显示蓝牙提示符

$ bluetoothctl
Agent registered
[bluetooth]#

命令列表:
打开蓝牙电源: power on
关闭蓝牙电源: power off
设置搜索可见: discoverable on

显示设备列表:

[bluetooth]# list
Controller DC:A6:32:A5:58:F2 raspberrypi [default]

搜索周边设备:

[bluetooth]# scan on
Discovery started
[CHG] Controller DC:A6:32:A5:58:F2 Discovering: yes
[NEW] Device 6A:DA:D3:A0:EC:91 6A-DA-D3-A0-EC-91
[NEW] Device F0:63:F9:4D:E1:39 SMU********000206
[NEW] Device FC:58:FA:E2:E4:3C Baseus COVO S17 Pro
[NEW] Device 4B:6B:12:4F:CE:8A 4B-6B-12-4F-CE-8A
[NEW] Device 50:EB:71:14:75:D4 DESKTOP-5N3BTUQ
[NEW] Device 90:F0:52:68:E5:95 @xiaoxin

配对设备:

[bluetooth]# pair FC:58:FA:E2:E4:3C

查看已配对设备:

[bluetooth]# paired-devices
Device FC:58:FA:E2:E4:3C Baseus COVO S17 Pro
Device 94:0E:6B:63:22:F9 Honor 8 Lite

连接设备: 连接成功后更改命令提示符

[bluetooth]# connect FC:58:FA:E2:E4:3C
Attempting to connect to FC:58:FA:E2:E4:3C
[CHG] Device FC:58:FA:E2:E4:3C Connected: yes
Connection successful
[CHG] Device FC:58:FA:E2:E4:3C ServicesResolved: yes
[Baseus COVO S17 Pro]#

断开连接:断开连接后,恢复命令提示符

[Baseus COVO S17 Pro]# disconnect FC:58:FA:E2:E4:3C
Attempting to disconnect from FC:58:FA:E2:E4:3C
[CHG] Device FC:58:FA:E2:E4:3C ServicesResolved: no
Successful disconnected
[CHG] Device FC:58:FA:E2:E4:3C Connected: no
[bluetooth]#

命令清单:

[bluetooth]# help
Menu main:
Available commands:
-------------------
advertise                                         Advertise Options Submenu
scan                                              Scan Options Submenu
gatt                                              Generic Attribute Submenu
list                                              List available controllers
show [ctrl]                                       Controller information
select <ctrl>                                     Select default controller
devices                                           List available devices
paired-devices                                    List paired devices
system-alias <name>                               Set controller alias
reset-alias                                       Reset controller alias
power <on/off>                                    Set controller power
pairable <on/off>                                 Set controller pairable mode
discoverable <on/off>                             Set controller discoverable mode
agent <on/off/capability>                         Enable/disable agent with given capability
default-agent                                     Set agent as the default one
advertise <on/off/type>                           Enable/disable advertising with given type
set-alias <alias>                                 Set device alias
scan <on/off>                                     Scan for devices
info [dev]                                        Device information
pair [dev]                                        Pair with device
trust [dev]                                       Trust device
untrust [dev]                                     Untrust device
block [dev]                                       Block device
unblock [dev]                                     Unblock device
remove <dev>                                      Remove device
connect <dev>                                     Connect device
disconnect [dev]                                  Disconnect device
menu <name>                                       Select submenu
version                                           Display version
quit                                              Quit program
exit                                              Quit program
help                                              Display help about this program
export                                            Print evironment variables

串口通信模式:
修改/etc/systemd/system/bluetooth.target.wants/bluetooth.service文件

# bluetoothd 命令后添加-C参数
ExecStart=/usr/lib/bluetooth/bluetoothd -C
# 添加下边一行命令(启动后运行)
ExecStartPost=/usr/bin/sdptool add SP

重启服务及系统:

sudo systemctl daemon-reload
reboot

开启蓝牙发现,并允许配对请求

$ sudo hciconfig hci0 piscan

若需关闭发现,使用

$ sudo hciconfig hci0 noscan
$ rfcomm watch hci0
Waiting for connection on channel 1

此时等待设备连接,可用手机搜索连接蓝牙设备,连接后显示:

Connection from 94:0E:6B:63:22:F9 to /dev/rfcomm0
Press CTRL-C for hangup

此时会在/dev目录下产生rfcomm0设备文件,此时可通过对/dev/rfcomm0文件进行读写操作。

- 阅读全文 -

树莓派笔记--无线路由器


安装软件包:

$ sudo apt-get install hostapd 
$ sudo apt-get install dnsmasq
$ sudo apt-get install isc-dhcp-server

hostapd将开启无线适配器的AP功能
dnsmasq DNS服务
isc-dhcp-server DHCP服务


取消wlan0的DHCP功能: 修改/etc/dhcpcd.conf文件,添加一行内容:

denyinterfaces wlan0

设置wlan0的静态IP:

# 修改文件 /etc/network/interfaces.d/wlan0 内容如下:
allow-hotplug wlan0
iface wlan0 inet static
    address 192.168.8.1
    netmask 255.255.255.0
    network 192.168.8.0
    broadcast 192.168.8.255

更新配置: 重启DHCP服务(客户端)和wlan0

sudo service dhcpcd restart
sudo ifdown wlan0
sudo ifup wlan0

新建配置文件: /etc/hostapd/hostapd.conf

# 指完无线网络接口
interface=wlan0

# Use the nl80211 driver with the brcmfmac driver
driver=nl80211

# SSID:无线网络名称
ssid=HelloWorld

# 使用2.4GHz频段
hw_mode=g

# 设置无线信道
channel=6

# 使能 802.11n 协议
ieee80211n=1

# 使能 WMM
wmm_enabled=1

# Enable 40MHz channels with 20ns guard interval
ht_capab=[HT40][SHORT-GI-20][DSSS_CCK-40]

# 允许所有MAC地址
macaddr_acl=0

# 使用 WPA 认证
auth_algs=1

# 设置是否隐藏SSID
ignore_broadcast_ssid=0

# 使用 WPA2 认证
wpa=2

# 使用预共享密钥
wpa_key_mgmt=WPA-PSK

# 网络密钥(有最小长度要求)
wpa_passphrase=88888888

# 使用AES, 而不用TKIP
rsn_pairwise=CCMP

测试网络:

sudo /usr/sbin/hostapd /etc/hostapd/hostapd.conf

能搜取网络即可, 修改/etc/default/hostapd文件,用于自动启动

# 将 DAEMON_CONF=""修改为
DAEMON_CONF="/etc/hostapd/hostapd.conf"

使能DHCP服务

修改配置文件/etc/dhcp/dhcpd.conf,内容如下

default-lease-time 600;
max-lease-time 7200;
log-facility local7;
 
subnet 192.168.8.0 netmask 255.255.255.0 {
    # IP地址范围
    range 192.168.8.10 192.168.8.100;
    option routers 192.168.8.1;
    option broadcast-address 192.168.8.255;
    option domain-name-servers 8.8.8.8,8.8.4.4;
    default-lease-time 600;
    max-lease-time 7200;
}

如果运行提示失败,尝试以下命令:

/usr/sbin/dhcpd -4 -q -cf /etc/dhcp/dhcpd.conf

设置IP转发(重要)
修改/etc/sysctl.conf文件,去掉net.ipv4.ip_forward=1前面的“#”号。

设置路由转发规则:

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i eth0 -o wlan0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i wlan0 -o eth0 -j ACCEPT

保存路由表:

sudo sh -c "iptables-save > /etc/iptables.ipv4.nat"

设为开机自动加载: 修改/etc/rc.local文件,添加一行内容

iptables-restore < /etc/iptables.ipv4.nat

https://www.waveshare.net/study/portal.php?mod=view&aid=744


问题处理:

Job for hostapd.service failed because the control process exited with error code.
See "systemctl status hostapd.service" and "journalctl -xe" for details.

查看状态:

$ systemctl status hostapd.service
● hostapd.service
   Loaded: masked (Reason: Unit hostapd.service is masked.)

原因是masked,直接unmask即可

sudo systemctl unmask hostapd

- 阅读全文 -


Copyright©2024 春天花会开, All Rights Reserved. Email: webmaster@oroct.com