---
# System prepended metadata

title: IoT Gateway - GIGAIPC
tags: [Edge]

---

---
title: IoT Gateway - GIGAIPC
tags: Edge
image:
---

# IoT Gateway - GIGAIPC

[toc]

## 維修後帳號
* address : 192.168.1.111
* 帳號：star 密碼：5giotlead
* root密碼：apexx

## todo

* how to check if modbus, serial, gpio are built-in kernel drivers?
* Brand new hardware installation steps 
* ...

##  技宸GIGAIPC | QBiX-WP-APLA3940H-A1

### Rear I/O

* 1 x (M12) COM (RS-232/422/485 & RI/5V/12V)
* 2 x (M12) COM (RS-232)
* 1 x (M12) GPIO (8 bits)
* 1 x (M12) DC IN

### BIOS

* ...
* ...

### Distribution

> Debian 11
```
star@gateway:~$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 11 (bullseye)
Release:        11
Codename:       bullseye

$ uname -a
Linux gateway 5.10.0-21-amd64 #1 SMP Debian 5.10.162-1 (2023-01-21) x86_64 GNU/Linux
```
> serial driver
```
$ sudo dmesg | grep -i serial
[    1.608690] Serial: 8250/16550 driver, 4 ports, IRQ sharing enabled
[    2.040732] usb usb1: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.040738] usb usb1: SerialNumber: 0000:00:15.0
[    2.046967] usb usb2: New USB device strings: Mfr=3, Product=2, SerialNumber=1
[    2.046973] usb usb2: SerialNumber: 0000:00:15.0

/lib/modules/5.10.0-21-amd64/kernel/drivers/tty/serial/8250/
8250
├── 8250_exar.ko
├── 8250_lpss.ko
└── serial_cs.ko
```
> gpio driver
```
$ sudo dmesg | grep -i gpio
[    7.988801] gpio_it87: disagrees about version of symbol module_layout

/lib/modules/5.10.0-21-amd64/kernel/drivers/hwmon/it87.ko
```

### Use case: Display


### Use case: iAeris2

> 室內空氣品質偵測器
[iAeris2 details](https://www.sysinnotec.com/product-cn)

* iAeris simple Command
[iAeris simple Command here](https://hackmd.io/@eric82418/iAeris20SimpleUsermanual)
* config 設定


.00000000000000000000000000000!!!注意Modbus必須將系統範例中的[server device]換成[master,slaves]!!!

![](https://i.imgur.com/fHETnmT.png)

```
{
  "master": {
    "slaves": [
      {
        "type": "serial",                     #必要 ModBus連結方式，tcp、udp、serial
        "method": "rtu",                      #必要 ModBus協定，serial分 rtu、ascii ，Tcp/udp分socket、rtu
        "port": "/dev/ttyS0",                 #必要 設定serial port 路徑
        "baudrate": 19200,                    #必要 設定設備baudrate
        "timeout": 35,                        #必要 
        "stopbits": 1,                        #The number of bits sent after each character in a message to indicate the end of the byte.
        "bytesize": 8,                        #The number of bits in a byte of serial data. This can be one of 5, 6, 7, or 8.
        "byteOrder": "BIG",                   #必要 位元組順序，分LITTLE 及 BIG
        "wordOrder": "BIG",                   #必要 
        "retries": true,                      #Retrying sending data to the master. The values: true or false
        "retryOnEmpty": true,                 #Retrying sending data to the master if it is empty
        "retryOnInvalid": true,               #Retrying sending data to the master if it is failed
        "pollPeriod": 5000,                   #必要 輪詢期 (ms)
        "unitId": 1,                          #必要 設備ID
        "deviceName": "iAeris 20",            #必要 設備名稱
        "deviceType": "intelligent cabinet",  #非必要 設定device profile type ，如果DeviceName已存在TB將無法生效 
        "attributesPollPeriod": 5000,
        "timeseriesPollPeriod": 5000,
        "sendDataOnlyOnChange": false,        #Sending only if data changed from last check, if no – data will send after every check
        "connectAttemptTimeMs": 5000,         #A period in milliseconds for waiting to connect to the master
        "connectAttemptCount": 5,             #The number of connection attempts made through the ThingsBoard gateway
        "waitAfterFailedAttemptsMs": 300000,  #A period in milliseconds for a wait before trying to send data to the master
        "attributes": [
        ],
        "timeseries": [
          {
            "tag": "temperature",             #Tag, which will use as attribute key for ThingsBoard platform instance.
            "type": "16uint",                 #Type of value. Available data types
            "functionCode": 3,                #Function to use in processing data. Modbus functions
            "objectsCount": 1,                #Count of objects to read.
            "address": 26                     #Object address to check.
          },
          {
            "tag": "humidity",
            "type": "16uint",
            "functionCode": 3,
            "objectsCount": 1,
            "address": 27
          }
        ],
        "attributeUpdates": [
        ],
        "rpc": [
        ]
      }
    ]
  }
}
```

![](https://i.imgur.com/esEZdeA.png)
```
star@gateway:/lib/modules/5.10.0-21-amd64/kernel/drivers/tty$ ls -l /dev/ttyS*
crwxrwxrwx 1 root dialout 4, 64 Feb  1 14:55 /dev/ttyS0
crw-rw-rw- 1 root dialout 4, 65 Jan 30 16:28 /dev/ttyS1
crw-rw-rw- 1 root dialout 4, 66 Jan 30 16:28 /dev/ttyS2
crw-rw-rw- 1 root dialout 4, 67 Jan 30 16:28 /dev/ttyS3
```

* ==接線方式==


### Use case: Reed switch

> 磁磺開關
[Garrison](https://www.garrison.com.tw/zh-tw/Category/%E7%A3%81%E7%A3%BA%E9%96%8B%E9%97%9C)

![](https://i.imgur.com/uf0in3B.png)

![](https://i.imgur.com/VehMttH.png)

* ==接線方式==

### GPIO Address based on Super IO - ITE8786E

> Lab 機種，==Default 欄位可能為 Low==。
![](https://i.imgur.com/96BORTt.png)

* **GPIO Driver**
```
//寶高對照組
gwbackup@GW-1:~$ ls -l /dev/gpiochip*
crw------- 1 root root 254, 0 Oct 18 13:43 /dev/gpiochip0
crw------- 1 root root 254, 1 Oct 18 13:43 /dev/gpiochip1
crw------- 1 root root 254, 2 Oct 18 13:43 /dev/gpiochip2
crw------- 1 root root 254, 3 Oct 18 13:43 /dev/gpiochip3
crw-rw-rw- 1 root root 254, 4 Oct 18 13:44 /dev/gpiochip4

gwbackup@GW-1:~$ sudo gpiodetect
[sudo] password for gwbackup:
gpiochip0 [INT3452:00] (78 lines)
gpiochip1 [INT3452:01] (77 lines)
gpiochip2 [INT3452:02] (47 lines)
gpiochip3 [INT3452:03] (43 lines)
gpiochip4 [gpio_it87] (64 lines)

gwbackup@GW-1:~$ lsmod | grep it87
gpio_it87              16384  0


// Lab 實驗組
$ ls -l /dev/gpiochip*
crw------- 1 root root 254, 0 Jan 30 16:28 /dev/gpiochip0
crw------- 1 root root 254, 1 Jan 30 16:28 /dev/gpiochip1
crw------- 1 root root 254, 2 Jan 30 16:28 /dev/gpiochip2
crw------- 1 root root 254, 3 Jan 30 16:28 /dev/gpiochip3

star@gateway:~$ sudo gpiodetect
[sudo] password for star:
gpiochip0 [INT3452:00] (78 lines)
gpiochip1 [INT3452:01] (77 lines)
gpiochip2 [INT3452:02] (47 lines)
gpiochip3 [INT3452:03] (43 lines)

star@gateway:~$ lsmod | grep it87
star@gateway:~$
```

* **insmod gpio_it87**

1.download GPIO-driver.tar.gz
2.``$ tar zxvf GPIO-driver.tar.gz``
```
star@gateway:/bin/root/GPIO/drv$ ls
giodrv.c     gpio-it87.ko     gpio-it87.mod.o  modules.order
giodrv.h     gpio-it87.mod    gpio-it87.o      Module.symvers
gpio-it87.c  gpio-it87.mod.c  Makefile
```
3.remake gpio-it87.ko ``$ sudo /bin/sh -c make``
```
[sudo] password for star:
make -C /lib/modules/5.10.0-21-amd64/build M=/usr/bin/root/GPIO/drv modules
make[1]: Entering directory '/usr/src/linux-headers-5.10.0-21-amd64'
  CC [M]  /usr/bin/root/GPIO/drv/gpio-it87.o
  MODPOST /usr/bin/root/GPIO/drv/Module.symvers
  CC [M]  /usr/bin/root/GPIO/drv/gpio-it87.mod.o
  LD [M]  /usr/bin/root/GPIO/drv/gpio-it87.ko
make[1]: Leaving directory '/usr/src/linux-headers-5.10.0-21-amd64'
```
4.``$ sudo insmod gpio-it87.ko``
5.check gpio
```
star@gateway:/bin/root/GPIO/test$ ls -l /dev/gpiochip*
.crw------- 1 root root 254, 0 Feb 23 12:00 /dev/gpiochip0
crw------- 1 root root 254, 1 Feb 23 12:00 /dev/gpiochip1
crw------- 1 root root 254, 2 Feb 23 12:00 /dev/gpiochip2
crw------- 1 root root 254, 3 Feb 23 12:00 /dev/gpiochip3
crw-rw-rw- 1 root root 254, 4 Mar  3 10:30 /dev/gpiochip4
star@gateway:/bin/root/GPIO/test$ .lsmod | grep it87

star@gateway:/bin/root/GPIO/test$ lsmod | grep it87
gpio_it87              16384  0
it87                   65536  0
hwmon_vid              16384  1 it87

gpiochip4 - 64 lines:
        line   0:  "it87_gp10"       unused   input  active-high
        line   1:  "it87_gp11"       unused   input  active-high
        line   2:  "it87_gp12"       unused   input  active-high
        line   3:  "it87_gp13"       unused   input  active-high
        line   4:  "it87_gp14"       unused   input  active-high
        line   5:  "it87_gp15"       unused   input  active-high
        line   6:  "it87_gp16"       unused   input  active-high
        line   7:  "it87_gp17"       unused   input  active-high
        line   8:  "it87_gp20"       unused   input  active-high
        line   9:  "it87_gp21"       unused   input  active-high
        line  10:  "it87_gp22"       unused   input  active-high
        line  11:  "it87_gp23"       unused   input  active-high
        line  12:  "it87_gp24"       unused   input  active-high
        line  13:  "it87_gp25"       unused   input  active-high
        line  14:  "it87_gp26"       unused   input  active-high
        line  15:  "it87_gp27"       unused   input  active-high
        line  16:  "it87_gp30"       unused   input  active-high
        line  17:  "it87_gp31"       unused   input  active-high
        line  18:  "it87_gp32"       unused   input  active-high
        line  19:  "it87_gp33"       unused   input  active-high
        line  20:  "it87_gp34"       unused   input  active-high
        line  21:  "it87_gp35"       unused   input  active-high
        line  22:  "it87_gp36"       unused   input  active-high
        line  23:  "it87_gp37"       unused   input  active-high
        line  24:  "it87_gp40"       unused   input  active-high
        line  25:  "it87_gp41"       unused   input  active-high
        line  26:  "it87_gp42"       unused   input  active-high
        line  27:  "it87_gp43"       unused   input  active-high
        line  28:  "it87_gp44"       unused   input  active-high
        line  29:  "it87_gp45"       unused   input  active-high
        line  30:  "it87_gp46"       unused   input  active-high
        line  31:  "it87_gp47"       unused   input  active-high
        line  32:  "it87_gp50"       unused   input  active-high
        line  33:  "it87_gp51"       unused   input  active-high
        line  34:  "it87_gp52"       unused   input  active-high
        line  35:  "it87_gp53"       unused   input  active-high
        line  36:  "it87_gp54"       unused   input  active-high
        line  37:  "it87_gp55"       unused   input  active-high
        line  38:  "it87_gp56"       unused   input  active-high
        line  39:  "it87_gp57"       unused   input  active-high
        line  40:  "it87_gp60"       unused   input  active-high
        line  41:  "it87_gp61"       unused   input  active-high
        line  42:  "it87_gp62"       unused   input  active-high
        line  43:  "it87_gp63"       unused   input  active-high
        line  44:  "it87_gp64"       unused   input  active-high
        line  45:  "it87_gp65"       unused   input  active-high
        line  46:  "it87_gp66"       unused   input  active-high
        line  47:  "it87_gp67"       unused   input  active-high
        line  48:  "it87_gp70"       unused   input  active-high
        line  49:  "it87_gp71"       unused   input  active-high
        line  50:  "it87_gp72"       unused   input  active-high
        line  51:  "it87_gp73"       unused   input  active-high
        line  52:  "it87_gp74"       unused   input  active-high
        line  53:  "it87_gp75"       unused   input  active-high
        line  54:  "it87_gp76"       unused   input  active-high
        line  55:  "it87_gp77"       unused   input  active-high
        line  56:  "it87_gp80"       unused   input  active-high
        line  57:  "it87_gp81"       unused   input  active-high
        line  58:  "it87_gp82"       unused   input  active-high
        line  59:  "it87_gp83"       unused   input  active-high
        line  60:  "it87_gp84"       unused   input  active-high
        line  61:  "it87_gp85"       unused   input  active-high
        line  62:  "it87_gp86"       unused   input  active-high
        line  63:  "it87_gp87"       unused   input  active-high
        
star@gateway:/etc/udev/rules.d$ cat 60-gpio.rules
KERNEL=="gpiochip4", MODE="0666" 

star@gateway:/sys/class/gpio$ ls -all
total 0
drwxr-xr-x  2 root root    0 Feb 23 12:00 .
drwxr-xr-x 56 root root    0 Feb 23 12:00 ..
--w-------  1 root root 4096 Feb 24 10:16 export
lrwxrwxrwx  1 root root    0 Mar  6 11:11 gpiochip203 -> ../../devices/gpiochip4/gpio/gpiochip203
lrwxrwxrwx  1 root root    0 Feb 23 12:00 gpiochip267 -> ../../devices/platform/INT3452:03/gpio/gpiochip267
lrwxrwxrwx  1 root root    0 Feb 23 12:00 gpiochip310 -> ../../devices/platform/INT3452:02/gpio/gpiochip310
lrwxrwxrwx  1 root root    0 Feb 23 12:00 gpiochip357 -> ../../devices/platform/INT3452:01/gpio/gpiochip357
lrwxrwxrwx  1 root root    0 Feb 23 12:00 gpiochip434 -> ../../devices/platform/INT3452:00/gpio/gpiochip434
--w-------  1 root root 4096 Feb 24 10:39 unexport

```



### Data Convert

  絕大多數Device 的數據儲存都是以 2 word 方式，在16進為轉換後皆需做一次二次轉換才能變成易讀取的數字。在Rule chian進行轉換可以不更動gateway本身程式碼，目前有兩種方式可進行數據轉換，Math function 及 Script
  1. Math function
  Math function 是最簡易的一種轉換方式，可以將一個或多個數據導入進行各式計算，但也存在缺點產出的輸出只能有一個，故計算多筆數據時，需產生大量Tool block在Rule Chain
  ![](https://i.imgur.com/TMLg2MN.png)
  ![](https://i.imgur.com/YOAyQaO.png)
  2. Script
  Script 顧名思義為腳本撰寫，除可計算數據多輸出外，還可進行更多的判斷式，其中分TBEL及Java Script兩種語言撰寫，可以在做簡易的腳本測試，再加入Rule chian
![](https://i.imgur.com/LpxrkI0.png)
![](https://i.imgur.com/Xr9u6X7.png)
![](https://i.imgur.com/XLRdixR.png)
  3. Config檔設定
  可以在config檔中設定每個屬性的乘除常數運算，但僅限乘除運算
  ![](https://i.imgur.com/SsZAtHT.png)


### 開機重啟edge、gateway server及web kiosk

[Debian 開機自動執行腳本](https://hackmd.io/@eric82418/HJ43S9Zg2)


* How to program GPIO?
  * file system 
  * sysfs interface
  * Python (using various modules)
  * C or C++


## References
* [QBiX-WP-APLA3940H-A1](https://drive.google.com/file/d/17tugO7gtcRPit-ClicDPVusX4ygYrPG5/view?usp=share_link)
* [必備的RS485接口知識](http://www.thcsys.com.tw/tech-inner.php?tech_id=25)
* [Using uart from a linux shell](https://developer.technexion.com/docs/using-uart-from-a-linux-shell)
* [Using gpio from a linux shell](https://developer.technexion.com/docs/using-gpio-from-a-linux-shell)
* [GPIO Programming: Using the sysfs Interface](https://www.ics.com/search/node?keys=gpio)
* [ICS  Tech Blog](https://www.ics.com/blog)
* **GPIO Programming**
  * [Part 1 An Introduction](https://www.ics.com/blog/introduction-gpio-programming)
  * [Part 2 Explore Hardware Capabilities of Raspberry Pi's GPIO Interface](https://www.ics.com/blog/explore-hardware-capabilities-raspberry-pis-gpio-interface)
  * [Part 3 Using the sysfs Interface](https://www.ics.com/blog/gpio-programming-using-sysfs-interface)
  * [Part 4 Control Raspberry Pi GPIO Pins from Python](https://www.ics.com/blog/control-raspberry-pi-gpio-pins-python)
  * [Part 5 How to Control GPIO Hardware from C or C++](https://www.ics.com/blog/how-control-gpio-hardware-c-or-c)
  * [Part 6 Experiment with this GPIO Learning Board](https://www.ics.com/blog/experiment-gpio-learning-board)
  * [Part 7 A Look at Toradex Colibri SOM with Aster Carrier Board](https://www.ics.com/blog/look-toradex-colibri-som-aster-carrier-board)
  * [Part 8 Examining the Cross-Platform libsoc Library](https://www.ics.com/blog/examining-cross-platform-libsoc-library)
  * [Part 9 Exploring the libgpiod Library](https://www.ics.com/blog/gpio-programming-exploring-libgpiod-library)
* **Linux_GPIO-Evolution_and_Current_State_of_the_User_API** [PDF](https://elinux.org/images/c/cb/Linux_GPIO-Evolution_and_Current_State_of_the_User_API.pdf)
* [Managing snaps](https://snapcraft.io/docs/service-management)