Lỗi không đọc được json dongabank từ websever android năm 2024

Bạn muốn xây dựng ứng dụng để gửi thông báo tới khoảng 1000 máy client có kết nối internet cùng một lúc mà không tốn phí thì có thể nghiên cứu cách sử dụng Google Cloud Message (GCM), trong bài tập này Tui sẽ hướng dẫn các bạn từng bước xây dựng ứng dụng sử dụng GCM. Trước tiên Tui vẽ lại quy trình sơ lược cách thức vận hành của GCM như hình dưới đây:

Lỗi không đọc được json dongabank từ websever android năm 2024

– Bạn chú ý là số 1,2,3,4 Tui để cùng màu đỏ

– Số 5,6 Tui để cùng màu xanh.

– Trung tâm Tui để Google Developer vì nó là điều phối cho các bước.

Quy trình hoạt động như sau (số thứ tự là bước):

Bước 0:

– Phải tạo một Project trên https://console.developers.google.com trước để có được Sender Id và Application Id

– Xây dựng Server và WebService của ta với CSDL phù hợp để lưu trữ Registration Id.

Bước 1:

– Các thiết bị Mobile Android sẽ gửi Sender Id và Application Id lên GCM server để đăng ký (chú ý là Sender Id được cung cấp từ Google Developers).

Bước 2:

– Nếu đăng ký thành công thì GCM Server sẽ tạo ra một mã đăng ký gọi là Registration Id và gửi ngược về cho thiết bị Android.

Bước 3:

– Sau khi nhận được Registration Id mà GCM Server gửi về, mỗi thiết bị Android này sẽ gửi Registration Id lên Server thông qua Web Service (chú ý là Server này do ta xây dựng, tức nó là độc lập với GCM Server của Google).

Bước 4:

– Sau khi Server của ta nhận được Registration Id (mỗi Android device sẽ được cung cấp Id riêng, theo từng session do GCM Server tạo ra) sẽ tiến hành lưu vào CSDL (do ta xây dựng) để sử dụng cho các lần sau này (gửi tin nhắn hàng loạt).

Bước 5:

– Xây dựng ứng dụng trên Server để cho phép gửi Tin nhắn hàng loạt (có thể gửi tới 1000 Android device mà không tốn phí), ở bước này cũng phải lấy Sender Id và Application Id do bước 0 tạo ra. Định dạng gửi tin sẽ theo JSON format, có thể gửi cả dấu Tiếng Việt.

– Tin nhắn ở bước này sẽ được gửi lên GCM Server.

Bước 6:

– Sau khi GCM Server nhận được tin nhắn theo định dạng JSON ở bước 5, nó sẽ tiến hành gửi tơi tất cả các máy trạm được đăng ký trong gói JSON này và gần như ngay lập tức các Client đều nhận được.

Bài này rất hay và có thể áp dụng được thực tế để giúp giảm thiểu chi phí nhắn tin SMS, vì về sau nhân viên sử dụng Smart Phone rất nhiều và dường như WIFI có trong mọi ngóc nghách hẻm hóc….. nên có thể triển khai để nhắn tin cho nhân viên thông báo họp hay đi ăn nhậu…. Đối với Trường học cũng vậy có thể áp dụng để nhắn tin cho học sinh , sinh viên lên tới 1000 người mà không tốn phí (Vì theo Tui càng về sau giới trẻ sẽ ưa chuộng Smart Phone hơn là cục gạch Nồi Đồng Cối Đá được sản xuất từ kiếp trước).

Bước 0, 5, 6 là xây dựng cho Server Side (CSDL, Webserver, WebService, Webform…)

Bước 1,2,3,4 là xây dựng cho Client Side (Android Application).

Chi tiết từng bước Tui sẽ hướng dẫn cụ thể để bạn có thể triển khai thực tế:

——————————————————————————

Bây giờ bạn cần làm theo từng bước dưới đây nhé:

Bước 0, 5,6: – Xây dựng Server Side

– Phải tạo một Project trên https://console.developers.google.com trước để có được Sender Id và Application Id

– Xây dựng Server và WebService của ta với CSDL phù hợp để lưu trữ Registration Id.

Như vậy ở bước 0 bạn phải xử lý 2 công việc chính đó là tạo project trên developer của google + xây dựng Server, bước này khá vất vả. Ngoài ra Tui sẽ dựng Webservice và CSDL ở trên Server miễn phí http://www.somee.com mà trong bài 44 Tui đã đề cấp tới, nếu bạn chưa rõ có thể vào bài này để xem lại (vì Tui sẽ không hướng dẫn lại nữa, chỉ hiển thị kết quả do đó bạn nào chưa học thì phải xem lại bài 44 thì mới hiểu được).

– Trước tiên cần phải tạo Project trên https://console.developers.google.com trước để có được Sender Id và Application Id. Sau khi bạn vào trang developer này và đăng nhập thì có giao diện như sau(dĩ nhiên google sẽ thay đổi nếu như có version mới):

Ở đây Tui dùng email [email protected] để hướng dẫn.

Lỗi không đọc được json dongabank từ websever android năm 2024
Ở màn hình trên bạn nhấn vào nút “Create Project” để tạo google project, màn hình sau xuất hiện:

Lỗi không đọc được json dongabank từ websever android năm 2024
Mục 1: Nhập vào tên Project, ở trên Tui đặt là drthanh

Mục 2: Nhập vào Project ID, nếu muốn nó tự tạo thì bạn nhấn mục số 3

Mục 3: Nhờ Google tạo ID

Mục 4: Bấm vào Create để chấp nhận tạo Project, chú ý bạn phải checked vào “I have read and agree to all”.

Sau khi bấm “Create“, bạn chờ giây lát google sẽ tạo project cho bạn như màn hình dưới đây:

Lỗi không đọc được json dongabank từ websever android năm 2024
Ở màn hình trên bạn nhìn vào chỗ Tui khoanh vòng tròn màu đỏ:

Project Number: 1009585144224

Đây chính là Sender ID, bạn cần nhớ chỗ này để copy + paste vào Client side (android) và Server side của bạn.

Bạn nhớ đừng có dùng Sender ID này của Tui nhé, nếu có quá nhiều người sài, mỗi người gửi 1000 client…. Google nói Tui Spam họ…. họ ngắt tài khoản của Tui…. Tui sẽ buồn man mác đó….Không hướng dẫn thêm được.

Nếu bạn bấm lung tung 1 hồi không tìm thấy Sender Id này thì nhớ bấm vào Overview để thấy lại nó nhé:

Lỗi không đọc được json dongabank từ websever android năm 2024
Như vậy ta đã có Sender Id, giờ Tui hướng dẫn các bạn tìm Application ID:

Bạn vào APIs & auth/ chọn Credentials:

Lỗi không đọc được json dongabank từ websever android năm 2024
Sau khi bạn nhấn vào “Credentials”, màn hình Credentials sẽ hiển thị ra như trên. Bạn nhấm vào mục số 2 “Create new Key” màn hình sau xuất hiện:

Lỗi không đọc được json dongabank từ websever android năm 2024
Ở màn hình trên bạn chọn “Server Key” thì màn hình tạo Key sau xuất hiện:

Lỗi không đọc được json dongabank từ websever android năm 2024
Tại màn hình này bạn để trống mặc định, chỉ việc bấm nút “Create“, ta có kết quả sau:

Lỗi không đọc được json dongabank từ websever android năm 2024
Ta thấy API key: AIzaSyCjjq8EvQQdwmKb9rolWnun_hf8zq2nTa8

API key chính là Application ID.

Như vậy bạn đã có được Sender ID và Application ID. Bạn cũng chú ý đừng sử dụng của Tui nhé, cố gắng tự tạo theo các bước Tui hướng dẫn mà sử dụng.

– Tiếp theo của bước 0, Ta cần xây dựng Webservice, CSDL trên Server. Ở đây Tui dùng http://somee.com để tải dịch vụ lên sử dụng. Bước này Tui sẽ hướng dẫn bạn 2 cách tạo Server để truyền tin tới client: Dùng Webservice và dùng Desktop Application để bạn có nhiều lựa chọn cũng như tăng thêm vốn kiến thức về vận hành GCM.

– Mọi thứ bạn nên tạo tại máy của bạn trước, sau khi test OK mới đưa lên Server.

Bây giờ bạn tạo cơ sở dữ liệu trong SQL Server với tên “dbDrThanhGCM“, với 2 bảng:

Lỗi không đọc được json dongabank từ websever android năm 2024
Bảng TinTuc:

Tên cột Kiểu loại Ghi chú NewsID varchar(50) Mã tin tức, khóa chính Title nvarchar(MAX) Tiêu đề tin tức IsDeleted int 1 là xác nhận sọt rác, 0 là còn sử dụng

Bảng TinTuc mục đích để thêm danh sách tin tức tại máy Server, mỗi lần thêm Tin nó sẽ tự động thông báo cho toàn bộ máy Client:

Bảng GCMRegistration:

Tên cột Kiểu loại Ghi chú RegNo int No (tự động tăng), khóa chính RegID nvarchar(MAX) Mã Registration ID của thiết bị do GCM server gửi về DateCreate date Ngày tạo IsDeleted int 1 là xác nhận sọt rác, 0 là còn sử dụng

Bảng GCMRegistration dùng để lưu trữ các Registration Id của các Thiết bị đăng ký thành công trên GCM Server. Ta cần tạo bảng này để lưu trữ lại toàn bộ Registration Id của các thiết bị để sử dụng cho việc thông báo hàng loạt ở các lần khác nhau. Thường các ID này mặc định được lưu trữ khoảng 4 tuần trên GCM Server.

Chú ý bảng GCMRegistration bạn có thể bỏ cột RegNo, dùng RegID làm khóa chính luôn. Nhưng tại vì Tui sợ Google thay đổi cơ chế làm tăng chiều dài của RegID sẽ vượt qua ràng buộc khóa chính nên Tui dùng RegNo tự động tăng, và bạn cũng chỉ quan tâm tới RegID vì nó là duy nhất (không quan tâm RegNo).

– Bạn tiến hành Tạo WebService để tương tác với 2 bảng dữ liệu như dưới đây (Tui tạo Solution để nó chứa luôn 2 Project: Webservice và Desktop Application): Tạo solution tên GCMSolution

Lỗi không đọc được json dongabank từ websever android năm 2024
Bấm OK để tạo Solution:

Lỗi không đọc được json dongabank từ websever android năm 2024
Tiến hành tạo ASP.NET project: Bấm chuột phải vào GCMSolution/chọn Add/New Project, màn hình sau xuất hiện:

Lỗi không đọc được json dongabank từ websever android năm 2024
Ta chọn cấu hình giống như mô tả ở trên, nhập tên “GCMWebService” rồi nhấn nút ok:

Lỗi không đọc được json dongabank từ websever android năm 2024
Trong màn hình New ASP.NET Project/chọn Empty rồi nhấn nút OK như hình.

Lỗi không đọc được json dongabank từ websever android năm 2024
– Bây giờ ta tiến hành tạo WebService tên drthanhgcmservice.asmx:

Bấm chuột phải vào GCMWebService/chọn Add/ Chọn Web Service (ASMX), xuất hiện màn hình sau cho phép nhập tên:

Lỗi không đọc được json dongabank từ websever android năm 2024
Nhập tên rồi bấm OK ta có kết quả mặc định như sau:

Lỗi không đọc được json dongabank từ websever android năm 2024
Giờ ta tiến hành tương tác CSDL để viết các dịch vụ.

Ta dùng LINQ để tương tác CSDL, bấm chuột phải vào GCMWebService/chọn Add/ chọn LINQ to SQL classes:

Lỗi không đọc được json dongabank từ websever android năm 2024
Sau đó tiến hành kết nối tới CSDL tạo ở trên (bạn nào không rõ thì xem lại các bài trước (bài 43, 44, 45, 46), Tui không muốn nói lại vì mất thời gian), sau khi cấu hình và kéo thả xong ta được như sau:

Lỗi không đọc được json dongabank từ websever android năm 2024
Bạn chú ý là chuỗi kết nối sẽ tự động được tạo trong file “Web.config“, và khi đưa lên server Somee thì ta chỉ việc đổi chuỗi kết nối trong file này là xong (bạn cũng xem lại các bài trước tui đã đề cập).

Ta tiến hành viết lệnh cho lớp drthanhgcmservice:

using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; namespace GCMWebService { ///

/// Summary description for drthanhgcmservice /// [WebService(Namespace = "http://tranduythanh.com/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. // [System.Web.Script.Services.ScriptService] public class drthanhgcmservice : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } /// /// Hàm này dùng để lưu RegistrationId từ GCM gửi về cho mỗi thiết bị /// /// /// [WebMethod] public bool insertRegID(string regId) { try { DrThanhGCMDataContext db = new DrThanhGCMDataContext(); GCMRegistration reg = db.GCMRegistrations.FirstOrDefault(c => c.RegID == regId); if (reg == null) { reg = new GCMRegistration(); reg.RegID = regId; reg.IsDeleted = 0; db.GCMRegistrations.InsertOnSubmit(reg); } reg.DateCreate = DateTime.Now; db.SubmitChanges(); return true; } catch (Exception ex) { } return false; } /// /// Hàm dùng để trả về danh sách Registration đã được lưu vào Server của ta /// để cung cấp cho việc gửi tin nhắn hàng loạt, chú ý là danh sách không nằm trong sọt rác /// /// isDeleted=0 là sẵn sàng, isDeleted=1 là bị nằm trong sọt rác /// [WebMethod] public GCMRegistration[] getListRegIDs(int isDeleted) { DrThanhGCMDataContext db = new DrThanhGCMDataContext(); var  listc = db.GCMRegistrations.Where(x => x.IsDeleted == isDeleted); return listc.ToArray(); } /// /// Hàm này dùng để lưu Registration vào sọt rác, thiết lập IsDeleted=1 /// /// /// [WebMethod] public bool moveRegToRecycleBin(string regId) { DrThanhGCMDataContext db = new DrThanhGCMDataContext(); GCMRegistration x = db.GCMRegistrations.FirstOrDefault(c => c.RegID == regId); if (x != null) { x.IsDeleted = 1; db.SubmitChanges(); return true; } return false; } /// /// hàm dùng để xóa vĩnh viễn Registration ra khỏi CSDL /// /// /// [WebMethod] public bool permanentlyRemoveReg(string regId) { DrThanhGCMDataContext db = new DrThanhGCMDataContext(); GCMRegistration x = db.GCMRegistrations.FirstOrDefault(c => c.RegID == regId); if (x != null) { db.GCMRegistrations.DeleteOnSubmit(x); db.SubmitChanges(); return true; } return false; } /// /// Hàm trả về danh sách tin tức, mục đích là mỗi lần thêm 1 tin tức thì thông báo cho /// máy client biết và cho phép mở xem danh sách tin mới. /// /// /// [WebMethod] public TinTuc[] getListTinTuc(int isDeleted) { DrThanhGCMDataContext db = new DrThanhGCMDataContext(); var ds=  db.TinTucs.Where(x =>  x.IsDeleted == 0); return ds.ToArray() ; } /// /// Hàm dùng để thêm mới 1 tin tức /// /// /// /// [WebMethod] public bool insertTinTuc(string ma,string title) { try { DrThanhGCMDataContext db = new DrThanhGCMDataContext(); TinTuc t = db.TinTucs.FirstOrDefault(c => c.NewsID == ma); if (t == null) { t = new TinTuc(); t.NewsID = ma; t.IsDeleted = 0; db.TinTucs.InsertOnSubmit(t); } t.Title = title; db.SubmitChanges(); return true; } catch (Exception ex) { } return false; } } }

-Tiếp theo ta tạo 1 Webform để gửi thông báo tới các máy trạm bằng cách bấm chuột phải vào GCMWebService/chọn Add/ chọn Web Form:

Lỗi không đọc được json dongabank từ websever android năm 2024
Cửa sổ tạo Webform hiển thị lên, bạn tạo tên như sau:

Lỗi không đọc được json dongabank từ websever android năm 2024
Tui đặt là “DrThanhWebForm” rồi nhấn nút OK, bạn nhấn nút Cancel cũng được nhưng mà phải làm lại.

Bạn thiết kế giao diện cho DrThanhWebForm như hình dưới đây:

Lỗi không đọc được json dongabank từ websever android năm 2024
txtThongBao: Nhập tin muốn thông báo xuống các máy trạm

btnGuiThongBao: Nút lệnh để bắt đầu thực hiện lệnh gửi tin

txtKetQua: Ô hiển thị kết quả sau khi gửi thông báo.

Tiến hành viết coding cho nút “Gửi Thông báo”, bạn double click vào nó để viết lệnh như dưới đây:

using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; namespace GCMWebService { public partial class DrThanhWebForm : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void btnGuiThongBao_Click(object sender, EventArgs e) { try { DrThanhGCMDataContext db = new DrThanhGCMDataContext(); //đây chính là API Key: (copy paste từ Google developer nhé) string applicationID = ""; //lấy danh sách Registration Id string[] arrRegid = db.GCMRegistrations.Where(c => c.IsDeleted == 0).Select(c => c.RegID).ToArray(); //đây chính là Sender ID: (copy paste từ Google developer nhé) string SENDER_ID = ""; //lấy nội dung thông báo string value = txtThongBao.Text; WebRequest tRequest; //thiết lập GCM send tRequest = WebRequest.Create("https://android.googleapis.com/gcm/send"); tRequest.Method = "POST"; tRequest.UseDefaultCredentials = true; tRequest.PreAuthenticate = true; tRequest.Credentials = CredentialCache.DefaultNetworkCredentials; //định dạng JSON tRequest.ContentType = "application/json"; //tRequest.ContentType = " application/x-www-form-urlencoded;charset=UTF-8"; tRequest.Headers.Add(string.Format("Authorization: key={0}", applicationID)); tRequest.Headers.Add(string.Format("Sender: id={0}", SENDER_ID)); string RegArr = string.Empty; RegArr = string.Join("\",\"", arrRegid); //Post Data có định dạng JSON như sau: /   { "collapse_key": "score_update",     "time_to_live": 108,       "delay_while_idle": true, "data": { "score": "223/3", "time": "14:13.2252" }, "registration_ids":["dh4dhdfh", "dfhjj8", "gjgj", "fdhfdjgfj", "đfjdfj25", "dhdfdj38"] } */ string postData = "{ \"registration_ids\": [ \"" + RegArr + "\" ],\"data\": {\"message\": \"" + value + "\",\"collapse_key\":\"" + value + "\"}}"; Console.WriteLine(postData); Byte[] byteArray = Encoding.UTF8.GetBytes(postData); tRequest.ContentLength = byteArray.Length; Stream dataStream = tRequest.GetRequestStream(); dataStream.Write(byteArray, 0, byteArray.Length); dataStream.Close(); WebResponse tResponse = tRequest.GetResponse(); dataStream = tResponse.GetResponseStream(); StreamReader tReader = new StreamReader(dataStream); String sResponseFromServer = tReader.ReadToEnd(); txtKetQua.Text = sResponseFromServer; //Lấy thông báo kết quả từ GCM server. tReader.Close(); dataStream.Close(); tResponse.Close(); Response.Write(@""); } catch(Exception ex) { //Response.Write(ex.ToString()); string msgError = ex.ToString(); Response.Write(@""); } } } }

– Bây giờ ta cần đưa toàn bộ CSDL và Web application này lên server somee để sử dụng chung (khi ta cấu hình trên này thì bất kỳ nơi đâu ta cũng có thể tương tác miễn là có Internet, bạn chú ý là khi đưa lên server somee thì họ yêu cầu 1 tháng phải tối thiểu 5 lần tương tác nhé nếu không họ sẽ xóa tài khoản.

– Các bước đưa lên somee.com Tui đã trình bày rất kỹ lưỡng trong các bài tập trước đó (Tui có đề cập ở trên) bạn phải tự xem lại và cấu hình để biết cách đưa lên, Tui chỉ hiển thị kết quả sau khi cấu hình xong (Chú ý nếu bạn không tự xem lại các bài trước thì hãy ngừng luôn tại đây đừng có đọc tiếp nữa vì sẽ vô ích do không hiểu, bạn không thể lấy cái không biết này để thực hiện cái không biết khác). Bạn chú ý sau khi cấu hình để đưa CSDL lên somee bạn cần đổi lại chuỗi kết nối trong web.config để cho giống với somee cung cấp trước khi đưa lên máy chủ Somee (Nếu bạn có riêng HOsting thì tự cấu hình, không cần dùng somee):

Lỗi không đọc được json dongabank từ websever android năm 2024

– Test Kết quả:

http://drthanhgcm.somee.com/DrThanhWebForm.aspx (link này để gửi thông báo đến hàng loạt client):

Lỗi không đọc được json dongabank từ websever android năm 2024
Bạn thấy đó, ở trên Tui nhập vào cụm từ “DrThanh đẹp trai”, khi bạn thấy phần kết quả thông báo danh chuỗi như trên và có success:(n) tức là đã gửi tới client thành công, lúc Tui bấm nút Gửi thông báo thì điện thoại của Tui cũng nhận được tin này. Nếu bây giờ bạn gõ chuỗi bất kỳ và bấm gửi Thông báo thì điện thoại của Tui cũng nhận được (do đó bạn đừng có SPAM nhé.. Tội nghiệp Tui…).

http://drthanhgcm.somee.com/drthanhgcmservice.asmx (dùng để tương tác thông tin giữa Client và Server của ta: Lưu Registration ID từ GCM server về, quản lý tin tức cũng như Registration (thêm mới, hiển thị danh sách):

Lỗi không đọc được json dongabank từ websever android năm 2024
Như vậy ta đã tạo xong bước Server Side, bạn có thể tải source code mẫu Server side ở đây:

Cơ sở dữ liệu: http://download855.mediafire.com/cwhped1w6dhg/cjc26c2bmia2276/dbDrThanhGCM.sql

Source code : http://download1501.mediafire.com/5dm93jhg9h7g/56azkjufqybm6lz/GCMSolution.rar

Chú ý Source code bạn cần sửa 2 file:

– File DrThanhWebForm.aspx.cs: Copy + paste lại Application ID và Sender Id của bạn

– File Web.config: Copy + paste lại chuỗi kết nối.

Tui đã test chạy thành công hết rồi mới đưa lên đây nhé các bạn, chú ý sửa 2 file lại cho đúng.

Chú ý là ở bước số 0 Tui sẽ quay lại sau để hướng dẫn cách viết Desktop application để tương tác sử dụng GCM Server nhé, tạm thời dùng Webform (vì Tui sợ nhiều quá các bạn sẽ rối).

Bước 1, 2, 3, 4: – Xây dựng Client Side

Bước này chính là xây dựng Android Application để:

– Gửi thông tin đăng ký lên GCM Server để nhận Registration Id

– Lưu Registration Id vào CSDL trên server (của ta xây dựng)

– Nhận thông báo từ Server (GCM Server)

Bạn tạo 1 Project mới với tên “DrThanhAndroidTestGCM“, Project này có 2 chức năng chính đó là:

– Tự động lắng nghe thông báo từ Server gửi về (Push Notification – GCM )

– Đọc danh sách Tin tức từ Server thông qua WebService.

Bạn chú ý là chương trình sẽ tự động nhận thông tin từ Server trong cả trường hợp Ứng dụng đã bị tắt.

Giao diện vô cùng tầm thường như sau:

Lỗi không đọc được json dongabank từ websever android năm 2024

XML layout như sau: