跳到主要內容

網頁引入相機及QRCode判讀

 之前有寫過實名制及報名網站內含 QRCode 的判讀功能,使用 Intascan 及 Webrtc 的 javascript 模組。

參考資料:[day14]-使用網頁開啟相機掃描QR Code-instascan介紹+實際應用(https://ithelp.ithome.com.tw/articles/10206308)


Instscan:https://github.com/schmich/instascan

Webrtc:https://github.com/webrtc/adapter

網頁



html 上半部是掃描結果訊息顯示的部份,result_icon 用 materical design icons 顯示各個圖示;scan_text 顯示掃描結東;result_text 顯示文字化結果。

下半以 video 顯示 WebRTC 從 Camera 擷取的畫面,並由 Instascan 依此資料判讀 QRCode 資訊。camera_select 作為切換 Camera 的功能。

Javascript

<script>

        let precode = '';

        let res = '';

        let audio = new Audio('audio_beep.mp3');

        let scanner = new Instascan.Scanner({

            video: document.getElementById('preview'),

            mirror: false

        });


        scanner.addListener('scan', function(content) {

            audio.play();

            document.getElementById('scan_text').innerHTML = content;

            let result_arr = content.split('-');

            let theyear='{{$param.semesteryear}}';

            let thename = 'KLART';

            if(result_arr[0] != thename){

                document.getElementById('result_icon').innerHTML = 'error';

                document.getElementById('result_text').innerHTML = '非本競賽之 QR-Code';

                precode='';

            }else{

                if(result_arr[1] != theyear){

                    document.getElementById('result_icon').innerHTML = 'error';

                    document.getElementById('result_text').innerHTML = '非本年度之 QR-Code'; 

                    precode='';

                }else{

                    $.ajax({

                        url: "{{base_url('/ajaxfunc/qrcodescan')}}/"+content,

                        success: function(data){

                            res = data.split(',');

                            if(res[0]=='ok'){

                                document.getElementById('result_icon').innerHTML = 'task_alt';

                                document.getElementById('result_text').innerHTML = res[1];

                            }else{

                                document.getElementById('result_icon').innerHTML = 'error';

                                document.getElementById('result_text').innerHTML = res[1];

                            }

                        }

                    });

                }

            }

        });


        Instascan.Camera.getCameras().then(function(cameras) {

            //取得設備的相機數目

            self.cameras = cameras;

            str = '';

            if (cameras.length > 0) {

                ///若設備相機數目大於0 則先開啟第0個相機(程式的世界是從第零個開始的)

                scanner.start(cameras[0]);

                for (i = 0; i < cameras.length; i++) {

                    str += '<button type="button" class="btn btn-primary btn-sm mx-1 mb-2" onclick="scanner.start(cameras[' + i + ']);"><i class="material-icons">videocam</i>' + (i+1) + '</botton>';

                }

                document.getElementById('camera_select').innerHTML = str;

            } else {

                //若設備沒有相機數量則顯示"No cameras found";

                //這裡自行判斷要寫什麼

                document.getElementById('result_icon').innerHTML = 'error';

                document.getElementById('scan_text').innerHTML = '無相機可供使用';

            }

        }).catch(function(e) {

            document.getElementById('result_icon').innerHTML = 'error';

            document.getElementById('result_text').innerHTML = e;

        });


        function cleardata() {

            document.getElementById('result_icon').innerHTML = 'loop';

            document.getElementById('scan_text').innerHTML = '';

            document.getElementById('result_text').innerHTML = '';

        }

    </script>



留言

這個網誌中的熱門文章

SSH Tunnel(Port Forwarding)的應用

自己在管理伺服器和防火牆原則是最小開放原則,一定需要的服務 port 才會開放,例如網頁伺服器的 80、443 等。而管理用的 ssh ,可以的話就限縮來源 IP 範圍,加上限制可以登入的帳號或群組,要不然就改 port 編號;不過,改 port 編號會變成自己在遠端登入時要回想是改成多少,有點不是很方便。 所以最近建置的伺服器就不改 port 了,會加上 fail2ban 的防衛機制。 因為最小開放原則,像是 webmin(10000)這樣的 port 就不會開放,如果想要用的話,就用 ssh tunnel 方式作跳板連接。 例如伺服器的 public ip:123.123.123.123,要連 webmin 的話,就用: ssh 123.123.123.123 -L 10000:127.0.0.1:10000 SSH 登入後就會在客戶端開啟 127.0.0.1:10000 的監聽埠,用瀏覽器連本機的 127.0.0.1:10000 就會跳到伺服器端的 10000 埠。 一直以來,我都以為 ssh -L (Local Port Forwarding)方式只會在本機端綁定 127.0.0.1:xxxx的情形。不過,最近因為要解決一個臨時伺服器的設定問題,才發現原來不是只能綁在 127.0.0.1 上。 網路架構: 外部 public ip:123.123.123.0/24 內部 private ip:10.1.0.0/16 內部切出多個 class C的網路區域,其中 10.1.1.0/24 是 ServerZone,在外面用 DNAT 的方式將服務要求導入內部的伺服器。 其他 10.1.n.0/24 是各個區域內容IP,只能 NAT 出去,外部不能訪問到。 需求: Server-01:10.1.1.2,Server-02:10.1.20.2 Server-01在 ServerZone 內,從外部可以訪問,Server-02 在 PrivateZone 內,外部連不到。ServerZone 和 PrivateZone 彼此可以 SSH 互連。 現在希望可以在不變動兩台 Server 的 IP 區域,讓 Server-02可以被外部訪問到。 最簡單的方式就是先登 Server-01後,再從 Server-01 terminal 登到 Server-02上。但是需求是,...

IPv6 系列(五):KEA DHCP SERVER

學校在純 IPv4 的環境時,採用 ISC-DHCP Server 來發放教學區域的私有 IP(10.10.xxx.xxx),並使用閘道 Fortigate 作 NAT 連接到 Internet。 採用 IPv6 後,原本是要使用 ISC-DHCPv6 來作為 IPv6 發放,結果 ISC-DHCPv6 架不起來。不過在查詢 DHCPv6 的過程中,發現 ISC(Internet System Consortium)已開發出下一代的 DHCP Server:Kea Dhcp Server。 Kea Dhcp Server 官網: https://www.isc.org/kea/ 摘錄  https://www.itread01.com/content/1548712273.html  對 Kea DHCP Server 的介紹: Kea DHCP Server 由 Internet Systems Consortium(ISC) 開發的開源 DHCPv4/DHCPv6 伺服器。Kea DHCP Server 是一個高效能的,可擴充套件的DHCP伺服器引擎。通過hooks library可以很容易的修改和擴充套件。 Kea包含的功能元件 keactrl — kea伺服器啟動,停止,配置重置和狀態查詢元件 kea-dhcp4 — DHCPv4伺服器程式,用於響應客戶端的DHCPv4查詢。 kea-dhcp6 — DHCPv6伺服器程式,用於響應客戶端的DHCPv6查詢。 kea-dhcp-ddns — DHCP動態DNS程式.這個程式在DHCP伺服器和DNS伺服器之間扮演者調解者。它接收來自DHCP伺服器域名更新請求和傳送DNS更新訊息給DNS伺服器。也就是說DDNS捕獲使用者每次變化的IP地址,然後將其與域名相對應,這樣其他上網使用者就可以通過域名來進行交流。而最終客戶所要記憶的全部,就是記住動態域名商給予的域名即可,而不用去管他們是如何實現的。 軟體執行環境 加密庫Botan或者OpenSSL log4cplus 1.0.3+ 如果有需要mysql,需要MySQL headers and libraries。可選(postgresql、cassandra類同) 選用 Kea DHCP Server 的原因,...

IPv6 系列(四):安全公用 DNS

繼學校開始採用 IPv6 後,在 Fortigate 防火牆除了原有的 IPv4 規則外,還要針對 IPv6 作設定。因為學校的資安策略除了會管制外部對內往伺服器的連線外,還會針對內部對外的不當連線,加上惡意網域日新月異,防不勝防,如此一來會增加人員與設備的負擔。 在 IPv4 環境中,學校內行政辦公室電腦採用固定 IP,其他教學部份均為 DHCP 動態發放 IP。而在 IPv6 的環境下,不管是 Stateless 或 Stateful 設定 IPv6,都會用到 DHCPv6 來設定 DNS 資訊。一般上網的動作一定會有 DNS 查詢的動作,所以可以把 DNS 查詢當作資安的防護層,也就是採用具有過瀘功能的公用 DNS 伺服器(Public DNS servers)。 提到 public dns server,一般都會想到的是 Google public dns 服務(8.8.8.8、8.4.4.8),但查詢 Google 的說明似乎沒有看到 Google 會特別針對資安防護的功能,所以改採用 cloudflare dns。 cloudflare dns 可以設定不同安全等級的 dns 位址: 一般使用 1.1.1.1  1.0.0.1 2606:4700:4700::1111  2606:4700:4700::1001 Malware Blocking Only 1.1.1.2 1.0.0.2 2606:4700:4700::1112 2606:4700:4700::1002 Malware and Adult Content 1.1.1.3 1.0.0.3 2606:4700:4700::1113 2606:4700:4700::1003 而且從 cloudflare dns 的官網說明上看,它還有隱私、安全的功能,速度也比較快。 除了 cloudflare dns 外,還有 opendns、comodo sercure dns 也有提供安全等級的選擇,但速度比較慢。 參考資料: https://blog.cloudflare.com/introducing-1-1-1-1-for-families/ https://developers.cloud...